sql/mysql

JSON_EXTRACT, [- >>]

choi-dev 2024. 6. 26. 10:02

mysql 내에 배열 값을 저장했는데 배열 값 내의 특정 값을 산출해서 결과값을 뽑아내야 하는 상황이 생겼다. 물론 실질적으로 mysql은 배열을 저장할 수 있도록 도와주지는 않는다. 하지만 배열을 문자열처럼 저장해서 파싱해 사용하는 식으로 사용하는 경우가 있기에 기록을 남겨두려고 한다.

 

방법은 위의 함수나 연산자를 사용해서 인덱스 값을 뽑을 수 있다.

 

CREATE TABLE example_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    data JSON
);

INSERT INTO example_table (data) VALUES
('[{"select": 1, "value": "a"}, {"select": 2, "value": "b"}, {"select": 3, "value": "c"}]'),
('[{"select": 4, "value": "d"}, {"select": 5, "value": "e"}, {"select": 6, "value": "f"}]');

위와 같이 임시로 테이블을 생성하고 데이터를 삽입해주겠다. example_table에서 0번째 인덱스의 select 값만 뽑으려고 하면 어떻게 해야할까?

 

JSON_EXTRACT

첫번째 방법은 JSON_EXTRACT 함수를 사용하는 것이다. 

 

SELECT id, JSON_EXTRACT(data, '$[0].select') AS select_value
FROM example_table;

방법은 간단하다. 위와 같이 입력하면 0번째 인덱스의 값인 select의 1이 나올 것이다.

 

->>

두번째 방법은 ->> 연산자를 사용하는 것이다.

 

SELECT id, data->>'$[1].select' AS select_value
FROM example_table;

마찬가지로 방법은 간단하다. 결과값은 JSON_EXTRACT를 사용했을 때랑 같을 것이다.

 

차이점

사실 결과값은 같아 보일 수 있는데 차이가 있다. JSON_EXTRACT 함수는 결과를 리턴할 때 JSON 형식으로 반환하다. {'select': 1}로 나오는 것이 맞지만 반환되는 값이 숫자이기에 1만 나오게 된 것이다. ->> 연산자는 결과를 JSON이 아닌 문자열로 반환하기 때문에 숫자로 나와 이 둘이 값이 똑같아 보이는 것이다.