如何使用postgresql中的参数计算表达式值

时间:2013-12-26 06:43:40

标签: sql regex postgresql

我试图在where子句中评估PostgreSQL中的正则表达式。

我有一个类似于下面示例(1,2)的列。当我在where子句中编写查询时,我将参数值作为“a”或“a,b”或“b”传递,那么它应该只返回包含“a”的行或“a,b”或“b”。

当我通过“a”时,它应检查行值并评估“AND”,“OR”条件。

实施例:1

((((a.b.city == "x" AND a.b.state == "y" AND a.b.country == "z")) OR 
   (dis(x.y.d1, x.y.d2, "47.6015", "-122.3304") <= 5)) 
  AND ((p.q.test == "**a**") OR (p.q.test == "b")))

实施例:2

((((a.b.city == "x" AND a.b.state == "y" AND a.b.country == "z")) OR
   (dis(x.y.d1, x.y.d2, "123", "-456") <= 5)) AND ((p.q.test == "a,b") 

以下是一个示例查询。

select * from testtable where  column ='parameter'

请建议。

1 个答案:

答案 0 :(得分:1)

很难弄清楚你在问什么,但我想你想要IN(...)

E.g。

 p.q.test IN ('a', 'b')

相当于

 p.q.test = 'a' OR p.q.test = 'b'

如果要匹配的列表是动态的,则可以将数组作为查询参数传递:

 p.q.test IN (?)

或以逗号分隔的列表:

 p.q.test = ANY (regexp_split_to_array(?,','))

如果您的p.q.test是逗号分隔值列表,则将其拆分,并使用&&(数组重叠)运算符将其与可能匹配的数组进行比较:

WITH test(x) AS (VALUES ('a,b'), ('a'), ('b'), ('a,b,c'), ('b,c'), ('d,e'), ('e')) 
SELECT x, regexp_split_to_array(x, ',') && ARRAY['a','b'] FROM test;

   x   | ?column? 
-------+----------
 a,b   | t
 a     | t
 b     | t
 a,b,c | t
 b,c   | t
 d,e   | f
 e     | f
(7 rows)

如果&&与您想要的不匹配,请查看阵列手册;也许@><@(包含/包含)运算符是您所需要的。