使用正则表达式替换select语句中的where子句

时间:2019-04-30 04:14:52

标签: sql oracle regexp-like

基本上,我想使用正则表达式替换下面的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无法正常工作,任何人都可以帮助我为上述两个(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');

2 个答案:

答案 0 :(得分:0)

您可能在其中添加了一个额外的位置

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

答案 1 :(得分:0)

如果我了解您要执行的操作,则应该可以进行以下操作:

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]类中带有字符的任何名称”。我使用了给定的第二个正则表达式。

好运。