# JSON

### 1. JSON\_EXTRACT()의 결과에서 JSON\_UNQUOTE()를 호출하는 것과 동일한 <mark style="background-color:green;">->> 연산자 추가</mark>

* **JSON\_UNQUOTE(JSON\_EXTRACT(col->"$.path"))** 와 동일
* JSON\_UNQUOTE(JSON\_EXTRACT())를 사용할 수 있는 모든 곳에서 사용 가능

<details>

<summary>세부 정보</summary>

```
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            |
+-------------------+
*/
```

</details>

### 2. JSON 집계 함수 JSON\_ARRAYAGG(), JSON\_OBJECTAGG() 추가 <a href="#json-ec-a7-91-ea-b3-84-ed-95-a8-ec-88-98-json_arrayagg-json_objectagg-ec-b6-94-ea-b0-80" id="json-ec-a7-91-ea-b3-84-ed-95-a8-ec-88-98-json_arrayagg-json_objectagg-ec-b6-94-ea-b0-80"></a>

* **JSON\_ARRAYAGG()** : **컬럼 또는 표현식**을 인수로 사용하고 결과를 **단일 JSON 배열로 집계**
* **JSON\_OBJECTAGG()** : **키와 값으로 해석되는 두 개의 컬럼 또는 표현식**을 사용하여 결과를 **단일 JSON 객체로 반환**

<details>

<summary>세부 정보</summary>

```
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"} |
+--------------------------+--------------------------------------------------------+
*/
```

</details>

### 3. 기존 JSON 값을 읽기 쉬운 형식으로 출력하는 JSON\_PRETTY() 함수 추가 <a href="#ea-b8-b0-ec-a1-b4-json-ea-b0-92-ec-9d-84-ec-9d-bd-ea-b8-b0-ec-89-ac-ec-9a-b4-ed-98-95-ec-8b-9d-ec-9c" id="ea-b8-b0-ec-a1-b4-json-ea-b0-92-ec-9d-84-ec-9d-bd-ea-b8-b0-ec-89-ac-ec-9a-b4-ed-98-95-ec-8b-9d-ec-9c"></a>

### 4. <mark style="background-color:green;">JSON 컬럼 값의 부분 업데이트</mark>에 대한 지원 추가

* JSON\_SET(), JSON\_REPLACE(), JSON\_REMOVE()

### 5. JSON\_STORAGE\_SIZE(), JSON\_STORAGE\_FREE() 함수 추가 <a href="#mysql-8.0.2-ec-97-90-ec-84-9c-json_storage_size-json_storage_free-ed-95-a8-ec-88-98-ec-b6-94-ea-b0-8" id="mysql-8.0.2-ec-97-90-ec-84-9c-json_storage_size-json_storage_free-ed-95-a8-ec-88-98-ec-b6-94-ea-b0-8"></a>

* **JSON\_STORAGE\_SIZE()** : 부분 업데이트 전에 JSON 도큐먼트의 바이너리 표현에 사용되는 저장 공간을 바이트 단위로 반환
* **JSON\_STORAGE\_FREE()** : JSON\_SET() 또는 JSON\_REPLACE()를 사용하여 부분적으로 업데이트된 후 JSON 유형의 테이블 컬럼에 남아 있는 공간의 크기를 제공

<details>

<summary>세부 정보</summary>

```
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 |
+-------------------------+
*/
```

</details>

### 6. <mark style="background-color:green;">XPath 표현식에서 $\[1 \~ 5]와 같은 범위</mark>에 대한 지원이 DBMS에 추가

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

<details>

<summary>세부 정보</summary>

```
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]                                              |
+--------------------------------------------------------+
*/
```

</details>

### 7. RFC 7396을 준수하도록 JSON 병합 함수 JSON\_MERGE\_PATCH() 추가 <a href="#rfc-7396-ec-9d-84-ec-a4-80-ec-88-98-ed-95-98-eb-8f-84-eb-a1-9d-json-eb-b3-91-ed-95-a9-ed-95-a8-ec-88" id="rfc-7396-ec-9d-84-ec-a4-80-ec-88-98-ed-95-98-eb-8f-84-eb-a1-9d-json-eb-b3-91-ed-95-a9-ed-95-a8-ec-88"></a>

* 2개의 JSON 객체를 아래 조건으로 단일 JSON 객체로 병합
  * 두 번째 객체에 동일한 키를 가진 멤버가 없는 첫 번째 객체의 각 멤버
  * 첫 번째 객체에 동일한 키를 가진 멤버가 없고 값이 JSON null 리터럴이 아닌 두 번째 객체의 각 멤버
  * 두 객체에 모두 존재하는 키가 있고 두 번째 객체의 값이 JSON null 리터럴이 아닌 각 멤버
  * JSON\_MERGE() => JSON\_MERGE\_PRESERVE() 함수명 변경

<details>

<summary>세부 정보</summary>

```
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}                                            |
+--------------------------------------------------------------------------------+
*/
```

</details>

### 8. 중복 키의 "last duplicate key wins" 정규화를 구현 <a href="#ec-a4-91-eb-b3-b5-ed-82-a4-ec-9d-98-22last-duplicate-key-wins-22-ec-a0-95-ea-b7-9c-ed-99-94-eb-a5-bc" id="ec-a4-91-eb-b3-b5-ed-82-a4-ec-9d-98-22last-duplicate-key-wins-22-ec-a0-95-ea-b7-9c-ed-99-94-eb-a5-bc"></a>

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

<details>

<summary>세부 정보</summary>

```
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} |
+----------------------------+
*/
```

</details>

### 9. JSON\_TABLE() 함수 추가 <a href="#mysql-8.0.4-ec-97-90-ec-84-9c-json_table-ed-95-a8-ec-88-98-ec-b6-94-ea-b0-80" id="mysql-8.0.4-ec-97-90-ec-84-9c-json_table-ed-95-a8-ec-88-98-ec-b6-94-ea-b0-80"></a>

* JSON 데이터를 받아 지정된 컬럼이 있는 관계형 테이블로 반환
* **JSON\_TABLE(expr, path COLUMNS column\_list) \[AS] alias)**

<details>

<summary>세부 정보</summary>

```
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] |
+-------+------+------+------+------+------+--------+
*/
```

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nhn-commerce.gitbook.io/nhn-1/add-option/json.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
