2015-11-05 65 views
2

林新手,PostgreSQL的JSON - SEACH如果陣列包括元件

我有2分JSON的:

  1. alergy_to

    { 「0」: 「胡蘿蔔」, 「1」:」香蕉」, 「2」: 「胡椒」}

  2. food_constains

    { 「0」: 「香蕉」, 「1」: 「牛奶」}

如何檢查我的 「food_constains」 JSON場constains這是在alergy_to JSON

列出,並返回true或false,或同等價值

回答

1

EDITED回答任何alergens

WITH alergy_to(data) AS (VALUES 
    ('{"0":"carrot","1":"banana","2": "pepper"}'::JSON) 
), food_contains(data) AS (VALUES 
    ('{"0":"banana", "1": "milk"}'::JSON) 
) 
SELECT 
    CASE WHEN EXISTS(
    SELECT true 
    FROM alergy_to at,json_each_text(at.data) alergy_item, 
    food_contains fc, json_each_text(fc.data) food_item 
    WHERE food_item.value = alergy_item.value 
) 
    THEN TRUE 
    ELSE FALSE 
END; 

欲瞭解更多詳情,請參閱JSON Postgres documentation

+0

非常感謝!我已將它編輯爲:WITH alergy_to(data)AS(VALERES ('{「0」:「carrot」,「1」:「banana」,「2」:「pepper」}':: JSON) ) ,food_contains(data)AS(VALUES ('{「0」:「banana」,「1」:「milk」}':: JSON) ) SELECT I TRUE as IHAVEALERGENS FROM alergy_to at,json_each_text(at.data )alergy_item, food_contains fc,json_each_text(fc.data)food_item WHERE food_item.value = alergy_item.value group by IHAVEALERGENS; – blackmoon

+0

和另一個變體 - 帶有表格:'WITH alergy_to(data)AS(VALUES('['carrot','banana','pepper']':: JSON)),food_contains(data)AS(VALUES(' 「香蕉」, 「牛奶」]':: JSON)) 選擇作爲IHAVEALERGENS FROM alergy_to在,json_array_elements_text(at.data)alergy_item, food_contains FC,json_array_elements_text(fc.data)FOOD_ITEM WHERE food_item.value = alergy_item TRUE .value group by IHAVEALERGENS;' – blackmoon

+0

'SELECT true'不是一個好主意,因爲查詢會返回與匹配值相同數量的行。特別是,如果沒有匹配的值,它將不返回行。如果您使用聚合函數,例如'SELECT count(*)> 0',你總是得到一行布爾值。 – klin