首页 > 解决方案 > 使用正则表达式替换 select 语句中的 where 子句

问题描述

基本上我想使用正则表达式从下面的 select 语句中替换 where 子句。(这里有三个条件:1.所有者名称2.要包含的表3.要排除的表)

SELECT *
FROM all_tables
WHERE owner = 'XXXXXXXX'
   AND (table_name LIKE '%_\_A' ESCAPE '\'
     OR table_name LIKE '%_\_B' ESCAPE '\'
     OR table_name LIKE '%_\_C' ESCAPE '\')
   AND (table_name NOT LIKE statement for (P|Q)(R|S)D(.*)(_D$)')

到目前为止我做了什么?

在下面的选择语句中,我编写了 REGEXP_LIKE 以获取以 A 或 B 或 C 结尾的表名,并且对于遵循 (P|Q)(R|S)*(_D)) 之类的模式并且需要的表名具有相同的 NOT REGEXP_LIKE排除。

我知道这种方式 REGEXP_LIKE 和 NOT REGEXP_LIKE 不起作用,任何人都可以帮我找到上述 2 的一个正则表达式(regexp_like 而不是 regexp_like)。非常感谢

SELECT table_name
FROM all_tables
WHERE owner = 'XXXXXXXX'
   AND REGEXP_LIKE (table_name, '(.*)((A|B|C)$)', 'i')
   AND WHERE NOT REGEXP_LIKE(table_name,'^(P|Q)(R|S)D(.*)(_D$)', 'i');

标签: sqloracleregexp-like

解决方案


如果我了解您要执行的操作,则以下内容应该有效:

SELECT table_name
FROM all_tables
WHERE owner = 'XXXXXXXX' AND
      REGEXP_LIKE (table_name, '[ABC]$', 'i') AND
      NOT REGEXP_LIKE(table_name,'^(P|Q)(R|S)D(.*)(_D$)', 'i')

第一个正则表达式说“在行尾之前接受任何带有类 [ABC] 字符的名称”。我按照给定的方式使用了您的第二个正则表达式。

祝你好运。


推荐阅读