2014-11-27 2 views
0

json, который я храню в postgres db, имеет следующую структуру. Мне нужно извлечь строки, в которых все домены электронной почты является «gmail.com»Psql query json array

Row1:

{ 
    "student_id": "123", 
    "name": "foo", 
    "emails":[ 
     { 
     "id": "777", 
     "domain": "gmail.com" 
     }, 
     { 
     "id": "888", 
     "domain": "gmail.com" 
     } 
    ] 
} 

Стр2:

{ 
    "student_ id": "345", 
    "name": "booo", 
    "emails":[ 
     { 
     "id": "444", 
     "domain": "gmail.com" 
     }, 
     { 
     "id": "555", 
     "domain": "yahoo.com" 
     } 
    ] 
} 

В этом случае мой результат должен быть только студент с student_id 123, то есть строка 1. Пожалуйста, помогите.

ответ

0

Учитывая, что имя таблицы student и имя поля, содержащее данные json, равно data.

WITH 
    mail_domain AS (
    SELECT 
     (data->'student_id')::text AS student_id, 
     (JSON_ARRAY_ELEMENTS(data->'emails')->'domain')::text AS domain 
    FROM 
     student), 

    selected_student AS (
    SELECT 
     student_id 
    FROM 
     mail_domain 
    WHERE 
     domain = '"gmail.com"' 

    EXCEPT 

    SELECT 
     student_id 
    FROM 
     mail_domain 
    WHERE 
     domain != '"gmail.com"') 

SELECT 
    * 
FROM 
    student 
WHERE 
    (data->'student_id')::text IN (
    SELECT 
     student_id 
    FROM 
     selected_student);