我试图在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'
请建议。
答案 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)
如果&&
与您想要的不匹配,请查看阵列手册;也许@>
或<@
(包含/包含)运算符是您所需要的。