我无法弄清楚如何使用数组为测试用例重写此查询:
--explain
SELECT COUNT(id)
FROM (
SELECT T.id
FROM product2 AS T
WHERE (ext @> 'p01=>1' OR ext @> 'p01=>2')
AND (ext @> 'p02=>1' OR ext @> 'p02=>2' OR ext @> 'p02=>3')
AND (ext @> 'p03=>2' OR ext @> 'p03=>3' OR ext @> 'p03=>4' OR ext @> 'p03=>5' OR ext @> 'p03=>6')
) T
我正在寻找像ext @> 'p01=[1,2]'
这样的东西。 documentation并未表明这是否可行。
注意:即使范围是可能的,我也不想要它们。
答案 0 :(得分:1)
以下将提取键'p01'的值,如果在数组中找到匹配项,则返回TRUE。这就是你追求的目标吗?
SELECT ('p01=>1,p01=>2,p02=>1,p02=>3,p02=>5'::hstore -> 'p01')::INTEGER = ANY(ARRAY[1,2,3,4,5])
修改为看起来像原始查询
SELECT count(*)
FROM (
SELECT t2.id
FROM product2 t2
WHERE (ext::HSTORE -> 'p01')::INTEGER = ANY(ARRAY[1,2])
AND (ext::HSTORE -> 'p02')::INTEGER = ANY(ARRAY[1,2,3])
AND (ext::HSTORE -> 'p03')::INTEGER = ANY(ARRAY[2,3,4,5,6])
) t;
这会产生意想不到的结果吗?