【问题标题】:SELECT values by another table with predefined regular expression使用预定义的正则表达式由另一个表选择值
【发布时间】:2014-05-17 20:54:41
【问题描述】:

我想使用预定义的正则表达式在我的另一个表中选择我的表中的行。
您可以在下面看到我的示例表:

code

id   |  codename
-----+------------
1    |   123456
2    |   NF123
3    |   AAA444
4    |   EEE123
5    |   EEE423
6    |   AB123E

validcode

 id   |  validreg
------+-----------
 1    |   [E]{3}[0-9]{3}
 2    |   NF123

这是sqlfidlle上的测试用例。

这是我尝试过的选择语句之一,但它不起作用:

SELECT n.codename FROM code n
WHERE EXISTS (SELECT * FROM validcode WHERE n.codename ~* E'^' || validreg || '$');

我收到此错误:

ERROR: argument of WHERE must be type boolean, not type text:
SELECT codename FROM code n WHERE EXISTS (SELECT * FROM validcode WHERE n.codename ~* E'^' || validreg || '$');

有可能以某种方式做到这一点吗?

【问题讨论】:

  • 您不需要where exists 或子查询。加入查询应该没问题,比如SELECT n.codename FROM code n, validcode WHERE n.codename ~* E'^' || validcode.validreg || '$'。不过可能效率不高。
  • 但它仍然不起作用,我认为问题出在我在这里某处进行连接的字符串中 ~* E'^' ||有效代码.validreg || '$'

标签: sql regex postgresql select


【解决方案1】:
SELECT n.codename FROM code n, validcode
WHERE  n.codename ~* ('^' || validcode.validreg || '$')

大括号,否则解析器会认为n.codename ~* E'^' 是其中的一部分,并将其余部分连接起来。

您的原始查询也可以使用额外的大括号。

【讨论】:

  • 问题是operator precedence,已在此答案中正确修复。原始的WHERE EXISTS (...) 与隐式或显式连接一样有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 2023-01-31
  • 2013-09-14
  • 1970-01-01
相关资源
最近更新 更多