JSON 함수
JSON 함수#
JSON 함수는 JSON 문서를 생성하거나 JSON 문서로부터 필요한 데이터를 검색하는 기능을 수행한다. JSON 함수는 세가지 유형으로 분류 할 수 있다.
- JSON 문서 생성 함수
- JSON_ARRAY
- JSON_OBJECT
- JSON 문서 검색 함수
- JSON_EXISTS
- JSON_QUERY
- JSON_VALUE
- JSON 문서 검증 함수
- JSON_VALID
JSON_ARRAY#
구문#
JSON_ARRAY ::=#
JSON_ARRAY_element ::=#
JSON_on_null_clause ::=#
JSON_ARRAY_returning_clause ::=#
설명#
리스트형태의 값을 인자로 받아서 JSON 배열을 생성하여 반환한다. JSON_ARRAY 함수의 인자로는 JSON 객체, JSON 배열, SQL 스칼라, BOOLEAN, NULL을 사용할 수 있다. JSON_on_null_clause 와 JSON_ARRAY_returning_clause를 지정할 수 있다.
JSON_on_null_clause#
인자에 NULL이 포함된 경우의 동작을 지정하기 위해 JSON_on_null_clause를 사용한다. 이 절을 명시하지 않으면, 기본 동작은 ABSENT ON NULL이다.
구문 | 설명 |
---|---|
NULL ON NULL | 함수의 인자에 NULL이 포함된 경우, NULL을 배열에 추가한다. |
ABSENT ON NULL (기본 동작) | 함수의 인자에 NULL이 포함된 경우, JSON 배열에 추가하지 않는다. |
JSON_returning_clause#
JSON_ARRAY 함수의 반환값의 데이터 타입을 지정할 수 있다. CHAR, VARCHAR, JSON, CLOB만 지정할 수 있다. 이때 CHAR 및 VARCHAR 타입에서 precision을 명시하지 않으면 기본값으로 1이 설정된다. 반면, 지원되지 않는 데이터 타입을 지정하면 오류가 발생한다.
JSON_returning_clause 를 명시하지 않으면, 반환값의 데이터타입은 VARCHAR로 설정되며, precision은 입력된 데이터의 크기에 따라 자동으로 계산된다.
예제#
iSQL> SELECT JSON_ARRAY(1,'altibase',NULL) JARRAY FROM DUAL;
JARRAY
-----------------------
[1,"altibase"]
1 row selected.
iSQL> SELECT JSON_ARRAY(1,'altibase',JSON_ARRAY(1,2,3),NULL NULL ON NULL) JARRAY FROM DUAL;
JARRAY
-----------------------
[1,"altibase",[1,2,3],null]
1 row selected.
iSQL> SELECT JSON_ARRAY(1,'altibase',JSON_ARRAY(1,2,3),NULL NULL ON NULL RETURNING JSON) JARRAY FROM DUAL;
JARRAY
------------------------------------------------------
[1,"altibase",[1,2,3],null]
1 row selected.
JSON_EXISTS#
구문#
JSON_EXISTS ::=#
JSON_EXISTS_on_error_clause ::=#
JSON_EXISTS_on_empty_clause ::=#
설명#
JSON 데이터에서 JSON 경로 표현식에 해당하는 값이 존재하는 여부를 반환한다. JSON_EXISTS_on_error_clause와 JSON_exists_on_empty_clause 를 지정할 수 있다.
JSON_EXISTS_on_error_clause#
JSON_EXISTS 함수의 실행 중 오류가 발생했을 때의 동작을 지정할 수 있다. 이 절을 명시하지 않으면, 기본 동작은 FALSE ON ERROR로 동작한다.
구문 | 설명 |
---|---|
ERROR ON ERROR | 오류가 발생하면, 해당 오류를 반환한다. |
FALSE ON ERROR(기본 동작) | 오류가 발생하면, FALSE를 반환한다. |
TRUE ON ERROR | 오류가 발생하면 TRUE를 반환한다. |
JSON_EXISTS_on_empty_clause#
JSON_EXISTS 함수의 실행 중 결과가 없을 때의 동작을 지정할 수 있다. 이 절을 명시하지 않으면, 기본 동작은 FALSE ON EMPTY이다.
구문 | 설명 |
---|---|
ERROR ON EMPTY | 검색 결과가 없으면 오류를 반환한다. |
FALSE ON EMPTY | 검색 결과가 없으면 FALSE를 반환한다. |
TRUE ON EMPTY | 검색 결과가 없으면 TRUE를 반환한다. |
예제#
iSQL> SELECT 1 AS result FROM DUAL WHERE JSON_EXISTS('{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}', '$.NATION?(@=="KOREA")');
RESULT
--------------
1
1 row selected.
iSQL> SELECT 1 AS result FROM DUAL WHERE JSON_EXISTS('{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}', '$.NATION?(@=="USA")');
RESULT
--------------
No rows selected.
iSQL> SELECT 1 AS result FROM DUAL WHERE JSON_EXISTS('invalid_json', '$' TRUE ON ERROR);
RESULT
--------------
1
1 row selected.
iSQL> SELECT 1 AS result FROM DUAL WHERE JSON_EXISTS('invalid_json', '$' FALSE ON ERROR);
RESULT
--------------
No rows selected.
iSQL> SELECT 1 AS result FROM DUAL WHERE JSON_EXISTS('invalid_json', '$' ERROR ON ERROR);
[ERR-314C6 : Invalid JSON data.
line 1:
invalid_json
^
]
JSON_OBJECT#
구문#
JSON_OBJECT ::=#
JSON_on_null_clause ::=#
JSON_OBJECT_returning_clause ::=#
설명#
키와 값의 쌍을 인자로 받아 JSON 객체를 생성하여 반환한다. 키는 문자형 값만 사용할 수 있으며, NULL은 키로 사용할 수 없다. 값은 키와 짝을 이루는 값으로 문자형, 숫자형, JSON 객체, JSON 배열, BOOLEAN, NULL을 사용할 수 있다. JSON_on_null_clause 와 JSON_OBJECT_returning_clause 를 지정할 수 있다.
JSON_on_null_clause#
값이 NULL 인 데이터를 JSON객체에 포함할지 여부를 지정할 수 있다. 이 절을 명시하지 않으면 NULL ON NULL로 동작한다.
구문 | 설명 |
---|---|
NULL ON NULL(기본 동작) | 값이 NULL인 데이터를 JSON 객체에 포함한다. |
ABSENT ON NULL | 값이 NULL인 데이터를 JSON 객체에 포함하지 않는다. |
JSON_OBJECT_returning_clause#
JSON_OBJECT 함수의 결과로 반환할 값의 타입을 지정할 수 있다. CHAR, VARCHAR, JSON, CLOB만 지정할 수 있다. 이때 CHAR 및 VARCHAR 타입에서 precision을 명시하지 않으면 기본값으로 1이 설정된다. 반면, 지원되지 않는 데이터 타입을 지정하면 오류가 발생한다.
이 절을 명시하지 않으면 반환값의 데이터타입은 VARCHAR로 설정되며, precision은 입력된 데이터의 크기에 따라 자동으로 계산된다.
예제#
iSQL> SELECT JSON_OBJECT('ID', 'AA000001', 'NAME', 'HONG GILDONG', 'NATION', 'KOREA') j_obj FROM DUAL;
J_OBJ
------------------------------------------------------------------------------------------------
{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}
1 row selected.
iSQL> SELECT JSON_OBJECT('USER1', '{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}', 'PURCHASE_NO', '[123,345,678]') j_obj FROM DUAL;
J_OBJ
---------------------------------------------------------------------------------------------------------------
{"USER1":"{\"ID\":\"AA000001\",\"NAME\":\"HONG GILDONG\",\"NATION\":\"KOREA\"}","PURCHASE_NO":"[123,345,678]"}
1 row selected.
iSQL> SELECT JSON_OBJECT('ID', 'AA000001', 'NAME', 'HONG GILDONG', 'NATION', NULL) j_obj FROM DUAL;
J_OBJ
-----------------------------------------------------------------------------------------
{"ID":"AA000001","NAME":"HONG GILDONG","NATION":null}
1 row selected.
iSQL> SELECT JSON_OBJECT('ID', 'AA000001', 'NAME', 'HONG GILDONG', 'NATION', NULL ABSENT ON NULL) j_obj FROM DUAL;
J_OBJ
-----------------------------------------------------------------------------------------
{"ID":"AA000001","NAME":"HONG GILDONG"}
1 row selected.
iSQL> SELECT JSON_OBJECT('ID', 'AA000001', 'NAME', 'HONG GILDONG', 'NATION', 'KOREA' RETURNING JSON) j_obj FROM DUAL;
J_OBJ
--------------------------------------------------------------------------------------------------------
{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}
1 row selected.
iSQL> SELECT JSON_OBJECT('ID', 'AA000001', 'NAME', 'HONG GILDONG', 'NATION', 'KOREA' RETURNING CLOB) j_ojb FROM DUAL;
J_OBJ
-----------------------------------------------------------------------------------
{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}
1 row selected.
JSON_QUERY#
구문#
JSON_QUERY ::=#
JSON_QUERY_returning_clause ::=#
JSON_QUERY_wrapper_clause ::=#
JSON_QUERY_on_error_clause ::=#
JSON_QUERY_on_empty_clause ::=#
설명#
JSON 문서에서 JSON 경로 표현식에 해당하는 값을 찾아서 반환한다. JSON_QUERY_returning_clause, JSON_QUERY_wrapper_clause, JSON_QUERY_on_error_clause, JSON_QUERY_on_empty_clause 를 지정할 수 있다.
JSON_QUERY_returning_clause#
JSON_QUERY 함수의 결과로 반환할 값의 타입을 지정한다. CHAR, VARCHAR, JSON, CLOB만 지정할 수 있다. 이때 CHAR 및 VARCHAR 타입에서 precision을 명시하지 않으면 기본값으로 1이 설정된다. 반면, 지원되지 않는 데이터 타입을 지정하면 오류가 발생한다.
JSON_returning_clause 를 명시하지 않으면, 반환값의 데이터타입은 VARCHAR로 설정되며, precision은 입력된 데이터의 크기에 따라 자동으로 계산된다.
JSON_QUERY_wrapper_clause#
JSON_QUERY 함수의 결과를 JSON 배열 형태로 반환할지 여부를 지정할 수 있다. 이 절을 명시하지 않으면 WITHOUT WRAPPER로 동작한다. UNCONDITIONAL과 ARRAY는 생략할 수 있다.
구문 | 설명 |
---|---|
WITH (ARRAY) WRAPPER | JSON_QUERY 함수의 결과를 JSON 배열 형태로 반환한다. JSON_QUERY 함수의 결과가 2개 이상이면, WITH WRAPPER 절을 지정해서 JSON 배열 형태로 반환해야 한다. |
WITHOUT (ARRAY) WRAPPER | JSON_QUERY 함수의 결과를 배열 형태로 반환하지 않는다. |
WITH UNCONDITIONAL (ARRAY) WRAPPER | WITH WRAPPER 절을 지정하는 것과 동일합니다. |
WITH CONDITIONAL (ARRAY) WRAPPER | JSON_QUERY 함수의 결과가 2개 이상일때만 배열 형태로 반환한다. |
JSON_QUERY_on_error_clause#
함수 실행 중 오류가 발생했을 때의 동작을 지정할 수 있다. 이 절을 명시하지 않으면, 기본 동작은 NULL ON ERROR로 동작한다.
구문 | 설명 |
---|---|
NULL ON ERROR(기본 동작) | 오류가 발생하면 NULL을 반환한다. |
ERROR ON ERROR | 오류가 발생하면 해당 오류를 반환한다. |
JSON_QUERY_on_empty_clause#
JSON_QUERY 함수 실행 중 반환된 결과가 없는 경우의 동작을 지정할 수 있다. 이 절을 명시하지 않으면, NULL ON EMPTY 로 동작한다.
구문 | 설명 |
---|---|
NULL ON EMPTY(기본 동작) | 검색 결과가 없으면 NULL을 반환한다. |
ERROR ON EMPTY | 검색 결과가 없으면 오류를 반환한다. |
예제#
iSQL> SELECT JSON_QUERY('{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}', '$.NAME') AS name FROM DUAL;
NAME
-----------------------
"HONG GILDONG"
1 row selected.
iSQL> SELECT JSON_QUERY('{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}', '$.NATION?(@=="KOREA")') AS nation FROM DUAL;
NATION
-----------------------
"KOREA"
1 row selected.
iSQL> SELECT JSON_QUERY('{"ID":"AA000001","NAME":"HONG GILDONG","ORDER_ID":[3123,2412,5286]}', '$.ORDER_ID') AS name FROM DUAL;
NAME
--------------------------------------------------------------------------------------------------------
[3123,2412,5286]
1 row selected.
-- WITH (UNCONDITONAL) (ARRAY) WRAPPER
iSQL> SELECT JSON_QUERY('{"ID":"AA000001","NAME":"HONG GILDONG","ORDER_ID":[3123,2412,5286]}', '$.ORDER_ID' WITH WRAPPER) AS name FROM DUAL;
NAME
--------------------------------------------------------------------------------------------------------
[[3123,2412,5286]]
1 row selected.
-- WITH CONDITONAL (ARRAY) WRAPPER
iSQL> SELECT JSON_QUERY('{"ID":"AA000001","NAME":"HONG GILDONG","ORDER_ID":[3123,2412,5286]}', '$.ORDER_ID' WITH CONDITIONAL WRAPPER) AS name FROM DUAL;
NAME
--------------------------------------------------------------------------------------------------------
[3123,2412,5286]
1 row selected.
iSQL> SELECT JSON_QUERY('{"ID":"AA000001","NAME":"HONG GILDONG","ORDER_ID":[3123,2412,5286]}', '$.*' ERROR ON ERROR) AS name FROM DUAL;
[ERR-314C0 : An array wrapper is required.]
iSQL> SELECT JSON_QUERY('{"ID":"AA000001","NAME":"HONG GILDONG","ORDER_ID":[3123,2412,5286]}', '$.*' WITH WRAPPER ERROR ON ERROR) AS name FROM DUAL;
NAME
--------------------------------------------------------------------------------------------------------
["AA000001","HONG GILDONG",[3123,2412,5286]]
1 row selected.
iSQL> SELECT JSON_QUERY('invalid_json', '$' NULL ON ERROR) AS jdata FROM DUAL;
JDATA
--------------------------------------------------------------------------------------------------------
1 row selected.
iSQL> SELECT JSON_QUERY('invalid_json', '$' ERROR ON ERROR) AS jdata FROM DUAL;
[ERR-314C6 : Invalid JSON data.
line 1:
invalid_json
^
]
JSON_VALID#
구문#
JSON_VALID ::=#
설명#
입력한 JSON 문서가 올바른 JSON 형식인지를 검사하여 결과를 반환한다. JSON 문서가 JSON 형식이면 1을, 아니면 0을 반환한다.
예제#
iSQL> SELECT JSON_VALID('{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}') AS valid FROM DUAL;
VALID
--------------
1
1 row selected.
iSQL> SELECT JSON_VALID('{"INVALID OBJ"}') AS valid FROM DUAL;
VALID
--------------
0
1 row selected.
JSON_VALUE#
구문#
JSON_VALUE ::=#
JSON_VALUE_returning_clause ::=#
JSON_VALUE_on_error_clause ::=#
JSON_VALUE_on_empty ::=#
설명#
JSON 문서에서 JSON 경로 표현식에 해당하는 값을 찾아 스칼라 값으로 반환한다. JSON_VALUE_returning_clause,JSON_VALUE_on_error_clause, JSON_VALUE_on_empty_clause 를 지정할 수 있다.
JSON_VALUE_returning_clause#
JSON_VALUE 함수의 결과로 반환할 값의 타입을 지정한다. CHAR, VARCHAR, CLOB, SMALLINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL, NUMBER, NUMERIC 만 지정할 수 있다. 이때 CHAR 및 VARCHAR 타입에서 precision을 명시하지 않으면 기본값으로 1이 설정된다. 반면, 지원되지 않는 데이터 타입을 지정하면 오류가 발생한다.
JSON_VALUE_returning_clause 를 명시하지 않으면, 반환값의 데이터타입은 VARCHAR로 설정되며, precision은 입력된 데이터의 크기에 따라 자동으로 계산된다.
JSON_VALUE_on_error_clause#
JSON_VALUE 함수 실행 중 오류가 발생했을 때의 동작을 지정할 수 있다. 이 절을 명시하지 않으면, 기본 동작은 NULL ON ERROR로 동작한다.
구문 | 설명 |
---|---|
NULL ON ERROR(기본 동작) | 오류가 발생하면 NULL을 반환한다. |
ERROR ON ERROR | 오류가 발생하면 오류를 반환한다. |
DEFAULT expr ON ERROR | 오류가 발생하면 expr을 반환한다 |
JSON_value_on_empty_clause
JSON_VALUE 함수 실행 중 반환된 결과가 없는 경우의 동작을 지정할 수 있다. 이 절을 명시하지 않으면, NULL ON EMPTY 로 동작한다.
구문 | 설명 |
---|---|
NULL ON EMPTY(기본 동작) | 검색 결과가 없으면 NULL을 반환한다. |
ERROR ON EMPTY | 검색 결과가 없으면 오류를 반환한다. |
DEFAULT expr ON ERROR | 검색 결과가 없으면 expr을 반환한다. |
예제#
iSQL> SELECT JSON_VALUE('{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}', '$.NAME') AS name FROM DUAL;
NAME
-----------------------
HONG GILDONG
1 row selected.
iSQL> SELECT JSON_VALUE('{"ID":"AA000001","NAME":"HONG GILDONG","NATION":"KOREA"}', '$.NATION?(@=="KOREA")') AS nation FROM DUAL;
NATION
--------------
KOREA
1 row selected.
iSQL> SELECT JSON_VALUE('invalid_json', '$' NULL ON ERROR) AS jdata FROM DUAL;
JDATA
--------------------------------------------------------------------------------------------------------
1 row selected.
iSQL> SELECT JSON_VALUE('invalid_json', '$' ERROR ON ERROR) AS jdata FROM DUAL;
[ERR-314C6 : Invalid JSON data.
line 1:
invalid_json
^
]
iSQL> SELECT JSON_VALUE('invalid_json', '$' DEFAULT 'ERROR' ON ERROR) AS jdata FROM DUAL;
JDATA
--------------------------------------------------------------------------------------------------------
ERROR
1 row selected.
iSQL> SELECT JSON_VALUE('invalid_json', '$' RETURNING VARCHAR(3) DEFAULT 'ERROR' ON ERROR) AS jdata FROM DUAL;
[ERR-314C1 : The default value exceeds the maximum length.]
iSQL> SELECT JSON_VALUE('invalid_json', '$' RETURNING VARCHAR(10) DEFAULT 'ERROR' ON ERROR) AS jdata FROM DUAL;
JDATA
--------------------------------------------------------------------------------------------------------
ERROR
1 row selected.