2016-06-09 50 views
2

我有我需要在JSON數組中搜索多個值的場景。以下是我的模式。如何搜索PostgreSQL中的JSON數組中的多個項目9.3

ID   DATA 
    1   {"bookIds" : [1,2,3,5], "storeIds": [2,3]} 
    2   {"bookIds" : [1,2], "storeIds": [1,3]} 
    3   {"bookIds" : [11,12,10,9], "storeIds": [4,3]} 

我希望所有行的值爲1,2。下面是我正在使用的查詢(這是查詢是由他的一個同事stackoverflow用戶先生klin信貸給他寫的)。

select t.* 
    from JSONTest t, json_array_elements(data->'bookIds') books 
    where books::text::int in (1, 2); 

但是,輸出我在輸出中重複行,下面是我的輸出。

 id  data 
    1  {"bookIds" : [1,2,3,5], "storeIds": [2,3]} 
    1  {"bookIds" : [1,2,3,5], "storeIds": [2,3]} 
    2  {"bookIds" : [1,2], "storeIds": [1,3]} 
    2  {"bookIds" : [1,2], "storeIds": [1,3]} 

我只想輸出兩行是id 1,2。我怎樣才能做到這一點?我不想使用distinct由於其他方面的限制,

SQL小提琴:http://sqlfiddle.com/#!15/6457a/2

回答

1

不幸的是,從一個JSON數組到一個「真實」的Postgres數組沒有直接的轉換功能。 (data ->'bookIds')::text返回幾乎是Postgres數組的文字:例如[1,2,3,5]。如果將[]替換爲{},則該值可以轉換爲整數數組。一旦我們有一個適當的整數數組,我們可以使用@>來測試它是否包含另一個數組:

select * 
from jsontest 
where translate((data ->'bookIds')::text, '[]', '{}')::int[] @> array[1,2]; 

translate((data ->'bookIds')::text, '[]', '{}')將轉換[1,2,3,5]{1,2,3,5}然後被轉換爲使用::int[]

SQLFiddle數組:http://sqlfiddle.com/#!15/6457a/4

+0

感謝這給了我一些繼續:)這種操作是多麼昂貴? –

相關問題