2016-10-03 2 views
0

들어오는 데이터를 구문 분석해야합니다 & 특정 키에 해당하는 값을 구하십시오. 내 데이터가 clob 유형이라는 가정하에 동일하게 JSON_VALUE을 사용하고 있습니다. JSON_VALUE 여러 값을 반환 할 수 있습니다

{"REGION": "AMR", "CNTRY": "US"} 

나는 "AMR"와 "EUR"(Ex: User selects 2 regions in the UI but selects only one country), 나는 CLOB의 값을 얻을 수 JSON_VALUE을 사용할 수 있습니다처럼 여러 지역을 얻을 필요가있는 경우

? 그렇다면 clob의 형식이 어떻게되어야합니다.

답변

0

귀하의 질문에 대한 답변은 JSON 문서의 구조에 따라 다릅니다. 하지만 우선, 데이터 유형 VARCHAR2, BLOBCLOB에서 JSON 값을 얻을 수 있습니다.

요구 사항을 어떻게 설명했는지에 따라 JSON의 구조는 위에서 지적한 바와 같이 객체 자체의 영역 배열을 갖게됩니다. 그럼이 같은 JSON을 가정 해 봅시다 : JSON_VALUE가 JSON 문서에서 주어진 스칼라 값을 얻기 위해 설계로

{ 
    "REGIONS": [ 
     {"REGION": "AMR", "CNTRY": "US"}, 
     {"REGION": "EUR", "CNTRY": "AT"} 
    ] 
} 

을 이러한 경우 JSON_VALUE에서하는 것은 더 이상 충분하지 않다 (그 지역에서 Oracle 12.2 will have significant enhancements 있습니다). 그러나 위의 경우 실제로 해당 객체의 배열을 관계형 행으로 모델링해야합니다. 즉, 하나의 JSON 문서가 있지만 각 행이되어야하는 항목의 배열이 있습니다. 이 경우 행을 생성하려면 JSON_TABLE을 사용해야합니다. 그래서 예를 들어 당신이 같은 쿼리를 작성할 수 있습니다 위 :

CREATE TABLE customers (doc CLOB CONSTRAINT doc_valid_json CHECK (doc IS JSON)); 
INSERT INTO customers (doc) VALUES (' 
{ 
    "REGIONS": [ 
     {"REGION": "AMR", "CNTRY": "US"}, 
     {"REGION": "EUR", "CNTRY": "AT"} 
    ] 
}'); 

COMMIT; 

SELECT jt.region, jt.cntry 
    FROM customers c, JSON_TABLE(c.doc, '$.REGIONS[*]' 
            COLUMNS (region VARCHAR2(3) PATH '$.REGION', 
              cntry VARCHAR2(2) PATH '$.CNTRY')) jt; 

은 SQL 위의 FROM 절에서 시작, 다음을 수행합니다 : 그것은 우리의 JSON은 CLOB로 열 doc을 문서화 보유하고 테이블 customers를 읽고 . 다음으로 우리를 위해 몇 가지 트릭을 수행하는 JSON_TABLE 연산자를 적용합니다. 먼저 JSON 문서 (여기서는 doc 열)가 포함 된 열을 전달해야합니다. 그런 다음 경로 접두사 즉, 전체 경로를 반복해서 반복 할 필요가없는 메커니즘을 제공 할 수 있습니다. JSON_TABLE에는 을 통해 표시된 "지역"의 배열에 포함 된 모든 요소 만보고 싶다고 말합니다. 마지막 단계로 JSON_TABLE에 우리가 바라는 요소, 즉 우리가 사용하기를 원하는 열 이름과 데이터 타입을 관계형 세계에서 볼 수 있어야한다고 말해야합니다. 이것은 COLUMNS 키워드를 통해 이루어집니다. VARCHAR2 유형과 JSON 문서 내 경로 모두 regioncntry 열을 지정하고자합니다. JSON_TABLE에 이미 '$.REGIONS[*]'을 통해 REGIONS의 배열 요소 만보고 싶다고 말했기 때문에 배열 요소 (이 경우 $.REGION$.CNTRY)를 선택하면됩니다. 다음 단계는 간단합니다. 먼저 JSON_TABLE (이 경우 jt)에 대한 테이블 별칭을 정의합니다. 이제 SELECT 부분으로 돌아가서 JSON 문서에서 방금 생성 한 두 개의 열, SELECT jt.region, jt.cntry을 선택할 수 있습니다.

당신은 모양과 LiveSQL.oracle.com

에서 위의 예제를 시도 할 수 있습니다
관련 문제