2014-11-27 2 views
0

postgres db에 저장 한 json의 구조는 다음과 같습니다.Psql json 배열 쿼리

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

행 2 : 나는 모든 이메일 도메인이 'gmail.com'을

ROW1 인 행을 인출 할 필요가

{ 
    "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);