2016-01-13 25 views
2
actName |  applicable  | status | id | 
----------------------------------------------------- 
    test1 | {"applicable":[1,3,7]} |  1 | 1 | 
    test2 | {"applicable":[5,4,1]} |  1 | 2 | 

是否有可能在陣列適用檢查值?例如。如果我試圖找到哪一行包含整數值3行列適用那麼它必須返回一行是第一行。如何使用WHERE子句來檢查值在Postgres的陣列存在

結果:

actName |  applicable  | status | id | 
----------------------------------------------------- 
    test1 | {"applicable":[1,3,7]} |  1 | 1 | 
+0

我不是很熟悉Postgres的陣列,但是從第一眼我會嘗試'SELECT * FROM表WHERE適用LIKE '%,3%''。 –

+0

PG版本? 'json'或'jsonb'類型的列'適用'? – Patrick

+0

適用於'json'類型 –

回答

2

您需要的功能json_array_elements()到UNNEST JSON數組,這樣就可以檢查它的元素。然後,它是相當簡單:

SELECT * 
FROM my_table 
WHERE id IN (
    SELECT id 
    FROM (
    SELECT id, json_array_elements(applicable->'applicable')::text::int AS chk 
    FROM my_table) sub 
    WHERE chk = 3); 

由於json值(以及由此的數組元素)可以是它們需要被投用的::text::intinteger任何類型的。您需要使用子選擇來檢查數組中值爲3的那些id值。請注意,這將返回具有相同數組值的多行。如果在一行中可能有多個重複數組值,則應該避免多次返回相同的行。

SQLFiddle

+0

它給出錯誤'錯誤:語法錯誤在或接近「子」' –

+0

對我來說它工作得很好,PG 9.4.5。你把所有的括號都對嗎? – Patrick

+0

它工作正常謝謝 –