JSON 필드에서 데이터 추출하기
JSON 으로 데이터를 저장하는 것은 유용하지만, 그 안의 개별 필드를 쿼리할 수 있어야 합니다. 이 단계에서는 JSON_EXTRACT 함수와 JSON_UNQUOTE를 사용하여 product_details 열에서 특정 값을 가져옵니다.
JSON_EXTRACT 함수를 사용하면 경로 표현식 (path expression) 을 사용하여 JSON 문서에서 값을 선택할 수 있습니다. 경로는 문서 루트를 나타내기 위해 $로 시작합니다.
노트북의 brand를 추출해 보겠습니다.
SELECT JSON_EXTRACT(product_details, '$.brand') AS brand FROM products WHERE product_name = 'Laptop';
이 쿼리는 브랜드 값을 반환하지만, 결과가 이중 따옴표를 포함하는 JSON 문자열임을 유의하십시오.
+--------+
| brand |
+--------+
| "Dell" |
+--------+
1 row in set (0.00 sec)
더 깔끔한 결과를 얻으려면 JSON_EXTRACT와 JSON_UNQUOTE를 함께 사용할 수 있습니다. 이 조합은 값을 추출하고 따옴표를 제거하여 일반 문자열을 반환합니다.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.brand')) AS brand FROM products WHERE product_name = 'Laptop';
이제 출력은 일반 텍스트인 Dell입니다.
+-------+
| brand |
+-------+
| Dell |
+-------+
1 row in set (0.00 sec)
경로 표현식을 사용하여 중첩된 객체의 값에 액세스할 수도 있습니다. specs 객체에서 processor를 가져오려면 경로 $.specs.processor를 사용합니다.
SELECT JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.specs.processor')) AS processor FROM products WHERE product_name = 'Laptop';
이렇게 하면 중첩된 값을 올바르게 추출할 수 있습니다.
+-----------------+
| processor |
+-----------------+
| Intel Core i7 |
+-----------------+
1 row in set (0.00 sec)
이 함수들은 행을 필터링하기 위한 WHERE 절에서도 유용합니다. 1000 이 넘는 가격의 모든 제품을 찾으려면 비교를 위해 추출된 JSON 값을 숫자 타입으로 CAST해야 합니다.
SELECT product_name, JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS price FROM products WHERE CAST(JSON_UNQUOTE(JSON_EXTRACT(product_details, '$.price')) AS SIGNED) > 1000;
이 쿼리는 JSON 필드 내의 숫자 값을 기반으로 레코드를 필터링하는 방법을 보여줍니다.
+--------------+-------+
| product_name | price |
+--------------+-------+
| Laptop | 1200 |
+--------------+-------+
1 row in set (0.00 sec)
이제 JSON 필드를 기반으로 데이터를 추출하고 필터링하는 방법을 알게 되었습니다.