JSON

1. JSON_EXTRACT()의 결과에서 JSON_UNQUOTE()를 호출하는 것과 동일한 ->> 연산자 추가

  • JSON_UNQUOTE(JSON_EXTRACT(col->"$.path")) 와 동일

  • JSON_UNQUOTE(JSON_EXTRACT())를 사용할 수 있는 모든 곳에서 사용 가능

세부 정보
SELECT * FROM t1;

/*
+--------------------------------------+
| jdoc                                 |
+--------------------------------------+
| {"key1": "value1", "key2": "value2"} |
+--------------------------------------+
*/

SELECT JSON_UNQUOTE(JSON_EXTRACT(jdoc, '$.key1')) FROM t1;

/*
+--------------------------------------------+
| JSON_UNQUOTE(JSON_EXTRACT(jdoc, '$.key1')) |
+--------------------------------------------+
| value1                                     |
+--------------------------------------------+
*/

SELECT jdoc -> '$.key1' FROM t1;

/*
+------------------+
| jdoc -> '$.key1' |
+------------------+
| "value1"         |
+------------------+
*/

SELECT jdoc ->> '$.key1' FROM t1;

/*
+-------------------+
| jdoc ->> '$.key1' |
+-------------------+
| value1            |
+-------------------+
*/

2. JSON 집계 함수 JSON_ARRAYAGG(), JSON_OBJECTAGG() 추가

  • JSON_ARRAYAGG() : 컬럼 또는 표현식을 인수로 사용하고 결과를 단일 JSON 배열로 집계

  • JSON_OBJECTAGG() : 키와 값으로 해석되는 두 개의 컬럼 또는 표현식을 사용하여 결과를 단일 JSON 객체로 반환

세부 정보
SELECT * FROM t1;

/*
+------+--------+
| a    | b      |
+------+--------+
| key1 | value1 |
| key2 | value2 |
| key3 | value3 |
+------+--------+
*/

SELECT JSON_ARRAYAGG(a), JSON_OBJECTAGG(a, b) FROM t1;

/*
+--------------------------+--------------------------------------------------------+
| JSON_ARRAYAGG(a)         | JSON_OBJECTAGG(a, b)                                   |
+--------------------------+--------------------------------------------------------+
| ["key1", "key2", "key3"] | {"key1": "value1", "key2": "value2", "key3": "value3"} |
+--------------------------+--------------------------------------------------------+
*/

3. 기존 JSON 값을 읽기 쉬운 형식으로 출력하는 JSON_PRETTY() 함수 추가

4. JSON 컬럼 값의 부분 업데이트에 대한 지원 추가

  • JSON_SET(), JSON_REPLACE(), JSON_REMOVE()

5. JSON_STORAGE_SIZE(), JSON_STORAGE_FREE() 함수 추가

  • JSON_STORAGE_SIZE() : 부분 업데이트 전에 JSON 도큐먼트의 바이너리 표현에 사용되는 저장 공간을 바이트 단위로 반환

  • JSON_STORAGE_FREE() : JSON_SET() 또는 JSON_REPLACE()를 사용하여 부분적으로 업데이트된 후 JSON 유형의 테이블 컬럼에 남아 있는 공간의 크기를 제공

세부 정보
SELECT * FROM t1;

/*
+--------------------------------------------------------+
| jdoc                                                   |
+--------------------------------------------------------+
| {"key1": "value1", "key2": "value2", "key3": "value3"} |
+--------------------------------------------------------+
*/

SELECT JSON_STORAGE_SIZE(jdoc) FROM t1;

/*
+-------------------------+
| JSON_STORAGE_SIZE(jdoc) |
+-------------------------+
|                      59 |
+-------------------------+
*/

SELECT JSON_STORAGE_FREE(jdoc) from t1;

/*
+-------------------------+
| JSON_STORAGE_FREE(jdoc) |
+-------------------------+
|                       0 |
+-------------------------+
*/

UPDATE t1 SET jdoc = JSON_SET(jdoc, '$.key3', 'val3');

SELECT * FROM t1;

/*
+------------------------------------------------------+
| jdoc                                                 |
+------------------------------------------------------+
| {"key1": "value1", "key2": "value2", "key3": "val3"} |
+------------------------------------------------------+
*/

SELECT JSON_STORAGE_FREE(jdoc) from t1;

/*
+-------------------------+
| JSON_STORAGE_FREE(jdoc) |
+-------------------------+
|                       2 |
+-------------------------+
*/

6. XPath 표현식에서 $[1 ~ 5]와 같은 범위에 대한 지원이 DBMS에 추가

  • $[last]가 항상 배열의 마지막(가장 높은 번호) 요소를 선택하고 $[last-1]이 마지막 요소 이전을 선택하도록 last 키워드 및 상대 주소 지정에 대한 지원 추가

세부 정보
SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[last-3 to last-1]');

/*
+--------------------------------------------------------+
| JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[last-3 to last-1]') |
+--------------------------------------------------------+
| [2, 3, 4]                                              |
+--------------------------------------------------------+
*/

7. RFC 7396을 준수하도록 JSON 병합 함수 JSON_MERGE_PATCH() 추가

  • 2개의 JSON 객체를 아래 조건으로 단일 JSON 객체로 병합

    • 두 번째 객체에 동일한 키를 가진 멤버가 없는 첫 번째 객체의 각 멤버

    • 첫 번째 객체에 동일한 키를 가진 멤버가 없고 값이 JSON null 리터럴이 아닌 두 번째 객체의 각 멤버

    • 두 객체에 모두 존재하는 키가 있고 두 번째 객체의 값이 JSON null 리터럴이 아닌 각 멤버

    • JSON_MERGE() => JSON_MERGE_PRESERVE() 함수명 변경

세부 정보
SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2, "e": null}', '{ "a": 3, "c":4, "d": null}');

/*
+--------------------------------------------------------------------------------+
| JSON_MERGE_PATCH('{ "a": 1, "b":2, "e": null}', '{ "a": 3, "c":4, "d": null}') |
+--------------------------------------------------------------------------------+
| {"a": 3, "b": 2, "c": 4, "e": null}                                            |
+--------------------------------------------------------------------------------+
*/

8. 중복 키의 "last duplicate key wins" 정규화를 구현

  • 키의 가장 오른쪽 멤버만 보존

세부 정보
CREATE TABLE t2 (c1 JSON);

INSERT INTO t2 VALUES ('{"x": 17, "y": -20, "x": "red", "x": [3, 5, 7]}');

SELECT c1 FROM t2;

/*
+----------------------------+
| c1                         |
+----------------------------+
| {"x": [3, 5, 7], "y": -20} |
+----------------------------+
*/

9. JSON_TABLE() 함수 추가

  • JSON 데이터를 받아 지정된 컬럼이 있는 관계형 테이블로 반환

  • JSON_TABLE(expr, path COLUMNS column_list) [AS] alias)

세부 정보
SELECT * FROM 
    JSON_TABLE(
        '[{"a":3,"b":"0"},{"a":"3","b":"1"},{"a":2,"b":1},{"a":0},{"b":[1,2]}]', "$[*]"
        COLUMNS(
            rowid FOR ORDINALITY,

            xa INT EXISTS PATH "$.a",
            xb INT EXISTS PATH "$.b",

            sa VARCHAR(100) PATH "$.a",
            sb VARCHAR(100) PATH "$.b",

            ja JSON PATH "$.a",
            jb JSON PATH "$.b"
        )
    ) AS  jt1;

/*
+-------+------+------+------+------+------+--------+
| rowid | xa   | xb   | sa   | sb   | ja   | jb     |
+-------+------+------+------+------+------+--------+
|     1 |    1 |    1 | 3    | 0    | 3    | "0"    |
|     2 |    1 |    1 | 3    | 1    | "3"  | "1"    |
|     3 |    1 |    1 | 2    | 1    | 2    | 1      |
|     4 |    1 |    0 | 0    | NULL | 0    | NULL   |
|     5 |    0 |    1 | NULL | NULL | NULL | [1, 2] |
+-------+------+------+------+------+------+--------+
*/

Last updated