귀하의 질문에 대한 답변은 JSON 문서의 구조에 따라 다릅니다. 하지만 우선, 데이터 유형 VARCHAR2
, BLOB
및 CLOB
에서 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 문서 내 경로 모두 region
및 cntry
열을 지정하고자합니다. JSON_TABLE
에 이미 '$.REGIONS[*]'
을 통해 REGIONS의 배열 요소 만보고 싶다고 말했기 때문에 배열 요소 (이 경우 $.REGION
및 $.CNTRY
)를 선택하면됩니다. 다음 단계는 간단합니다. 먼저 JSON_TABLE
(이 경우 jt
)에 대한 테이블 별칭을 정의합니다. 이제 SELECT 부분으로 돌아가서 JSON 문서에서 방금 생성 한 두 개의 열, SELECT jt.region, jt.cntry
을 선택할 수 있습니다.
당신은 모양과 LiveSQL.oracle.com
에서 위의 예제를 시도 할 수 있습니다