2013-07-17 64 views
0

我想不出使用數組的測試用例如何重新編寫這個查詢:PostgreSQL的HSTORE GIN查詢

--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

下面將提取鍵'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; 

這給了意想不到的結果?

+0

如果我執行此操作,會得到不同的結果。我追隨你所說的。 – IamIC

+0

我剛剛*制定了一些非常相似的東西。 ((ext - >'p01'):: int = ANY('{1,2}':: int [])) – IamIC

+0

Final(:(ext - >'p01'):: int = ANY(ARRAY [ 1,2])) – IamIC