Teradata REGEXP_SIMILAR 匹配精确字符串
Teradata REGEXP_SIMILAR matching exact string
我有这样获得的数据库和表的列表:
SELECT TRIM(DatabaseName) || '.' || TRIM(TableName) AS DatabaseTable
FROM DBC.TablesV t1
WHERE TableKind IN ('T','O','V')
我现在想将它们与 dbc.TablesV.RequestText 匹配以构建我的数据库视图的层次结构。
起初我用下面的简单连接来做到这一点
JOIN DBC.TablesV t2
ON t2.RequestText LIKE '%' || DatabaseTable || '%'
但不幸的是,我们有像 T1010_User 和 T1010_User_Hist 这样的表,以及像 DB_STAGE
和 Q_DB_STAGE
这样的数据库,所以我决定在 % 中添加空格到 LIKE子句使它成为 LIKE '% ' || DatabaseTable || ' %'
但它无法获得正确的结果,因为有时表名位于请求文本的末尾,如下所示:(...) DB_STAGE.TableName;
有时如下所示:
(...)
FROM
DB_STAGE.TableName t1
(...)
我决定使用 REGEXP_SIMILAR 将它们与 WHEN REGEXP_SIMILAR() = 1
匹配,但我的 regex-fu 很弱,所以我无法构建可以执行以下操作的正则表达式:
((anything other than a letter/number) or nothing) DatabaseTable ((anything other than a letter/number) or nothing)
这是为了构建视图层次结构,以帮助将数据迁移到不同的数据库。
这是一个非常简化的案例:
CREATE VOLATILE TABLE test1
(
c0 SMALLINT,
c1 varchar(100)
)ON COMMIT PRESERVE ROWS;
INSERT INTO test1 VALUES(1,'aaa
Q_abcdef.abcdef');
INSERT INTO test1 VALUES(2,' Q_abcdef.abcdef ');
INSERT INTO test1 VALUES(3,'aaa
DQ_abcdef.abcdef ');
INSERT INTO test1 VALUES(4,' S_abcdef.abcdef');
INSERT INTO test1 VALUES(5,'Q_abcdef.abcdefg');
INSERT INTO test1 VALUES(6,' sdfs
Q_abcdef.abcdefg');
INSERT INTO test1 VALUES(DQ_abcdef,' 7.abcdefg');
INSERT INTO test1 VALUES(8,' S_abcdef.abcdefg');
INSERT INTO test1 VALUES(9,'Q_abcdef.abcdef;');
INSERT INTO test1 VALUES(10,' Q_abcdef.abcdef;');
INSERT INTO test1 VALUES(11,'DQ_abcdef.abcdef;');
INSERT INTO test1 VALUES(12,' S_abcdef.abcdef;');
我需要匹配 1、2、9 和 10。具有字符串 Q_abcdef.abcdef 的那些。
您可以使用 \b
来匹配 单词边界:
WHERE REGEXP_SIMILAR (c1, '.*\bQ_abcdef.abcdef\b.*', 'i') = 1
这不会 return 5 & 6 因为它不匹配,因为最终 g
我有这样获得的数据库和表的列表:
SELECT TRIM(DatabaseName) || '.' || TRIM(TableName) AS DatabaseTable
FROM DBC.TablesV t1
WHERE TableKind IN ('T','O','V')
我现在想将它们与 dbc.TablesV.RequestText 匹配以构建我的数据库视图的层次结构。 起初我用下面的简单连接来做到这一点
JOIN DBC.TablesV t2
ON t2.RequestText LIKE '%' || DatabaseTable || '%'
但不幸的是,我们有像 T1010_User 和 T1010_User_Hist 这样的表,以及像 DB_STAGE
和 Q_DB_STAGE
这样的数据库,所以我决定在 % 中添加空格到 LIKE子句使它成为 LIKE '% ' || DatabaseTable || ' %'
但它无法获得正确的结果,因为有时表名位于请求文本的末尾,如下所示:(...) DB_STAGE.TableName;
有时如下所示:
(...)
FROM
DB_STAGE.TableName t1
(...)
我决定使用 REGEXP_SIMILAR 将它们与 WHEN REGEXP_SIMILAR() = 1
匹配,但我的 regex-fu 很弱,所以我无法构建可以执行以下操作的正则表达式:
((anything other than a letter/number) or nothing) DatabaseTable ((anything other than a letter/number) or nothing)
这是为了构建视图层次结构,以帮助将数据迁移到不同的数据库。
这是一个非常简化的案例:
CREATE VOLATILE TABLE test1
(
c0 SMALLINT,
c1 varchar(100)
)ON COMMIT PRESERVE ROWS;
INSERT INTO test1 VALUES(1,'aaa
Q_abcdef.abcdef');
INSERT INTO test1 VALUES(2,' Q_abcdef.abcdef ');
INSERT INTO test1 VALUES(3,'aaa
DQ_abcdef.abcdef ');
INSERT INTO test1 VALUES(4,' S_abcdef.abcdef');
INSERT INTO test1 VALUES(5,'Q_abcdef.abcdefg');
INSERT INTO test1 VALUES(6,' sdfs
Q_abcdef.abcdefg');
INSERT INTO test1 VALUES(DQ_abcdef,' 7.abcdefg');
INSERT INTO test1 VALUES(8,' S_abcdef.abcdefg');
INSERT INTO test1 VALUES(9,'Q_abcdef.abcdef;');
INSERT INTO test1 VALUES(10,' Q_abcdef.abcdef;');
INSERT INTO test1 VALUES(11,'DQ_abcdef.abcdef;');
INSERT INTO test1 VALUES(12,' S_abcdef.abcdef;');
我需要匹配 1、2、9 和 10。具有字符串 Q_abcdef.abcdef 的那些。
您可以使用 \b
来匹配 单词边界:
WHERE REGEXP_SIMILAR (c1, '.*\bQ_abcdef.abcdef\b.*', 'i') = 1
这不会 return 5 & 6 因为它不匹配,因为最终 g