【发布时间】:2016-10-25 17:20:39
【问题描述】:
我有这样获得的数据库和表的列表:
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 在 requesttext 的末尾是这样的:(...) DB_STAGE.TableName; 有时是这样的:
(...)
FROM
DB_STAGE.TableName t1
(...)
我决定使用 REGEXP_SIMILAR 将它们与WHEN REGEXP_SIMILAR() = 1 匹配,但我的 regex-fu 很弱,所以我无法构建会执行以下操作的 regex:
((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 的那些。
【问题讨论】: