【问题标题】:Teradata REGEXP_SIMILAR matching exact stringTeradata REGEXP_SIMILAR 匹配精确字符串
【发布时间】: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_STAGEQ_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 的那些。

【问题讨论】:

    标签: regex teradata


    【解决方案1】:

    您可以使用\b 来匹配单词边界

    WHERE REGEXP_SIMILAR (c1, '.*\bQ_abcdef.abcdef\b.*', 'i') = 1
    

    这不会返回 5 和 6,因为由于最终的 g 不匹配

    【讨论】:

    • 哦,我的错。 5 和 6 是错误的,所以这可能是我想要的。非常感谢(编辑主要问题)。
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多