PostgreSQL HSTORE GIN查询

时间:2013-07-17 18:21:28

标签: arrays postgresql operators postgresql-9.2 hstore

我无法弄清楚如何使用数组为测试用例重写此查询:

--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并未表明这是否可行。

注意:即使范围是可能的,我也不想要它们。

1 个答案:

答案 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;

这会产生意想不到的结果吗?