ERROR 3141 (22032): Invalid JSON text in argument 1 to function json_contains: "Invalid value." at position 0.


에러 환경

 

Client OS: Windows10

Server OS: Ubuntu 22.04.2 LTS

MySQL: 8.0.30


에러 원인

 

JSON_CONTAINS 함수 사용할 때 인자값이 잘못되어 발생하는 에러입니다.

대부분 작은 따옴표('), 큰 따옴표(")를 잘못써서 발생합니다.


해결 방안

 

JSON_CONTAINS('컬럼', '1')

 

함수 파라미터를 전달할 때 작은 따옴표(')를 사용합니다.

 

JSON_CONTAINS('컬럼','"문자열"')

 

문자열을 전달할 때는 큰 따옴표(") 를 사용하고 다시 작음 따옴표(')로 감싸줘야 합니다. 


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

Json, 다중 Json 데이터 WHERE문 검색하기

 

MySQL 5.7 버전부터는 Json 타입의 데이터를 사용할 수 있습니다. Json 타입의 데이터를 검색하는 방법에 대해 알아봅시다.


테스트용 테이블 만들기

 

테이블 생성

# 테이블 생성 #
CREATE TABLE json_test (
	name varchar(8),
	data json
)

Query OK, 0 rows affected (0.01 sec)

# 테이블 확인 #
DESC json_test;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name  | varchar(8) | YES  |     | NULL    |       |
| data  | json       | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+

2 rows in set (0.00 sec)

 

데이터 추가

# 데이터 추가 #
INSERT INTO json_test(name, data) VALUE ('test0','{"id":0, "value": { "name": "a", "array": [0, 2] } }');
INSERT INTO json_test(name, data) VALUE ('test1','{"id":1, "value": { "name": "b", "array": [0, 3] } }');
INSERT INTO json_test(name, data) VALUE ('test2','{"id":2, "value": { "name": "c", "array": [1, 2] } }');

# 데이터 확인 #
SELECT * FROM json_test;
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test0 | {"id": 0, "value": {"name": "a", "array": [0, 2]}} |
| test1 | {"id": 1, "value": {"name": "b", "array": [0, 3]}} |
| test2 | {"id": 2, "value": {"name": "c", "array": [1, 2]}} |
+-------+----------------------------------------------------+
3 rows in set (0.00 sec)

테스트용 테이블 검색하기

 

Json 검색

SELECT * FROM json_test
WHERE data->"$.id" = 0;
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test0 | {"id": 0, "value": {"name": "a", "array": [0, 2]}} |
+-------+----------------------------------------------------+
1 row in set (0.00 sec)

 

Json 타입 컬럼명 -> "$.필드이름" 형식을 이용하여 Json 데이터에 접근할 수 있습니다.

 

다중 Json 검색

SELECT * FROM json_test
WHERE data->"$.value.name" = "c";
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test2 | {"id": 2, "value": {"name": "c", "array": [1, 2]}} |
+-------+----------------------------------------------------+
1 row in set (0.00 sec)

 

Json 타입 컬럼명 -> "$.필드이름.필드이름" 형식을 이용하여 Json 속 Json 데이터에 접근할 수 있습니다.

 

Json 속 배열 검색

SELECT * FROM json_test
WHERE data->"$.value.array[0]" = 0;
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test0 | {"id": 0, "value": {"name": "a", "array": [0, 2]}} |
| test1 | {"id": 1, "value": {"name": "b", "array": [0, 3]}} |
+-------+----------------------------------------------------+
2 rows in set (0.00 sec)

 

Json 타입 컬럼명 -> "$.필드이름[n]" 형식을 이용하여 Json 속 배열 n번째 데이터에 접근할 수 있습니다.

 

Json 속 배열 전체 내 검색

SELECT * FROM json_test
WHERE JSON_CONTAINS(data->"$.value.array",'2');
+-------+----------------------------------------------------+
| name  | data                                               |
+-------+----------------------------------------------------+
| test0 | {"id": 0, "value": {"name": "a", "array": [0, 2]}} |
| test2 | {"id": 2, "value": {"name": "c", "array": [1, 2]}} |
+-------+----------------------------------------------------+
2 rows in set (0.00 sec)

 

JSON_CONTAINS(배열,값) 함수를 이용하여 특정값 배열이 있는 데이터를 찾을 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

+ Recent posts