【问题标题】:Using Regular expression to replace where clause in select statement使用正则表达式替换 select 语句中的 where 子句
【发布时间】:2019-09-18 16:47:06
【问题描述】:

基本上,我想使用正则表达式替换下面 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)) 和需要排除。

我知道这种方式 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');

【问题讨论】:

  • 您使用的是 Oracle 还是 DB2?
  • 非常感谢您的回复,我正在使用 Oracle。
  • 关于您的第二个正则表达式的问题:括号应该是文字字符,还是您使用括号对表达式进行分组?谢谢。
  • 上面使用的括号用于分组,例如 P 或 Q 在上面的示例中可以排在第一位,同样它应该只以 _D 结尾,因此将它们分组。

标签: sql oracle regexp-like


【解决方案1】:

你可能添加了一个额外的 WHERE

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');

【讨论】:

  • 谢谢吉姆,你的观点是正确的。我正在使用另一个不需要的“位置”。现在一切都好。再次感谢。
  • 有时需要第二双眼睛:)
【解决方案2】:

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

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] 字符的名称”。我使用了你的第二个正则表达式。

祝你好运。

【讨论】:

  • 感谢 Bob 的评论,但是您修改的第一个正则表达式不能在这里使用,因为我们上面提到的字母 ABC 只是示例,实际上它以它们的组合结尾可能就像 AB 或 2A 之类的东西。在这种情况下你能帮我吗?我主要面临在一个地方制作所有三个 where 子句的问题。
  • 如果你写的问题与你的实际问题不匹配,当你得到的答案不能解决你的问题时,你几乎不会感到惊讶。我建议你写另一个问题,清楚地解释你遇到的问题和你遇到的困难。但是,正则表达式[ABC]$ 将匹配以A 或B 或C 结尾的字符串,例如'AB''2A''THE_RAIN_IN_SPAIN_FALLS_MAINLY_IN_THE_C'dbfiddle here。也许你应该学习正则表达式的教程。
  • 谢谢 Bob,我会去那里看看,到目前为止,“哪里”已经解决了这个问题,但是,我会检查你提到的内容并更新你。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多