我有这样的数据库和表格列表:
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 || ' %'
,但随后它无法获得正确的结果,因为有时tablename位于请求文本的末尾,如下所示:(...) DB_STAGE.TableName;
,有时会像这样:
(...)
FROM
DB_STAGE.TableName t1
(...)
我决定使用REGEXP_SIMILAR将它们与WHEN REGEXP_SIMILAR() = 1
匹配,但我的正则表达式很弱,因此我无法构建可执行以下操作的正则表达式:
((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的那些。
答案 0 :(得分:0)
您可以使用\b
来匹配字边界:
WHERE REGEXP_SIMILAR (c1, '.*\bQ_abcdef.abcdef\b.*', 'i') = 1
这不会返回5& 6因为最终g