복붙노트

[SQL] JSON 열의 배열의 요소를 쿼리

SQL

JSON 열의 배열의 요소를 쿼리

최근 JSONfunctionalities을 활용 PostgreSQL의 9.3.1을 사용하여 업그레이드. 내 표에서이 같은 구조를 가진 JSON 형식 열이 :

{
   "id": "123",
   "name": "foo",
   "emails":[
      {
        "id": "123",
        "address": "somethinghere"
      },
      {
        "id": "456",
        "address": "soemthing"
      }
   ]
} 

이 질문의 목적을 위해 단지 더미 데이터입니다.

그것은 ID를 기반으로 이메일 배열에서 특정 항목에 대해 조회 할 수 있습니까? 꽤 많은 : "반환 이메일 어디 ID = 123)"?

해결법

  1. ==============================

    1.네, 가능합니다 :

    네, 가능합니다 :

    SELECT *
    FROM   tbl t, json_array_elements(t.json_col->'emails') AS elem
    WHERE  elem->>'id' = 123;
    

    TBL json_col는 JSON 컬럼의 이름 인, 테이블 이름 인.

    이 관련 대답 자세한 내용 :

    더 많은 암시 CROSS에 대한이 관련 대답의 마지막 단락에서 측면 가입 :

    지수는 쿼리 이런 종류의 지원 :

  2. ==============================

    2.9.4+ 포스트 그레스에서 JSONB 열 사용하면이 연산자를 포함 사용할 수 있습니다 @> 쿼리에 배열의 요소 :

    9.4+ 포스트 그레스에서 JSONB 열 사용하면이 연산자를 포함 사용할 수 있습니다 @> 쿼리에 배열의 요소 :

    SELECT * FROM jsontest WHERE data @> '{ "emails": [{ "id": "123" }] }';
    

    자세한 내용은 JSON 형식의 내부 배열 요소에 대한 쿼리를 참조하십시오.

    다음은 작업 예입니다 :

    CREATE TABLE jsontest(data JSONB NOT NULL);
    INSERT INTO jsontest VALUES (
      '{
         "name": "foo",
         "id": "123",
         "emails": 
         [
           {
             "address": "somethinghere",
             "id": "123"
           },
           {
             "address": "soemthing",
             "id": "456"
           }
         ]
      }'
    );
    SELECT * FROM jsontest WHERE data @> '{ "emails": [{ "id": "123" }] }';
    
    data
    ----
    {"id": "123", "name": "foo", "emails": [{"id": "123", "address": "somethinghere"}, {"id": "456", "address": "soemthing"}]}
    

    (1 행)

  3. ==============================

    3.이 게시물에 우연히 발견 직접 쿼리 같은 테이블에 수 :

    이 게시물에 우연히 발견 직접 쿼리 같은 테이블에 수 :

    SELECT *
    FROM   table_name, json_array_elements(json_column) AS data
    WHERE  data->>'id' = 123;
    

    이 부분을 생략 :

    json_array_elements(t.json_col->'emails')
    
  4. ==============================

    4.당신은 간단하게 그것을 할 수 있습니다 :

    당신은 간단하게 그것을 할 수 있습니다 :

    SELECT * FROM table WHERE emails->>'id' = '123';
    

    당신이 이런 식으로 할 수있는 정수가 있다면 당신은 문자열로 ID를 저장 같다 :

    SELECT *  from table WHERE cast(emails->>'id' as integer ) = 123  ;
    

    또는 당신은 ID로 모든 행을 얻을 수 있습니다> (10)

    SELECT *  from table WHERE cast(emails->>'id' as integer ) > 10  ;
    
  5. from https://stackoverflow.com/questions/19568123/query-for-element-of-array-in-json-column by cc-by-sa and MIT license