mysql 5.0에서 json 형태의 데이터가 유동적일때 질문 드립니다. 0 2 931

by 오라클초보 [MySQL] mysql json [2021.09.01 22:43:46]


mysql 5.0에서 json 형태의 [ ] 안에 데이터가 고정적으로 3개일때는 결과를 구하는데
[ ] 안의 데이터가 유동적일때는 쉽사리 답이 나오지 않아서 질문 드립니다.

cntt : [{"id":100,"name":"사과"},{"id":101,"name":"바나나"},{"id":121,"name":"배"}]

SELECT  JSON_UNQUOTE(JSON_EXTRACT(cntt, '$[1].id')) AS id
       ,JSON_UNQUOTE(JSON_EXTRACT(cntt, '$[1].name')) AS name
       ,JSON_UNQUOTE(JSON_EXTRACT(cntt, '$[2].id')) AS id
       ,JSON_UNQUOTE(JSON_EXTRACT(cntt, '$[2].name')) AS name
       ,JSON_UNQUOTE(JSON_EXTRACT(cntt, '$[3].id')) AS id
       ,JSON_UNQUOTE(JSON_EXTRACT(cntt, '$[3].name')) AS name
  FROM  tb_tmp;

id name
100 사과
101 바나나
102

json 형태의 데이터가 [ ] 에 고정적으로 3개일때는 위와 같이 하면 되는데
[ ] 안에 유동적으로 몇개가 있는지 알수 없는 경우에 결과를 구하는 방법에 도움을 부탁드립니다.

감사합니다.

 

 

 

 

 

by 마농 [2021.09.02 09:02:11]
WITH tb_tmp AS
(
SELECT '[{"id":100,"name":"사과"},{"id":101,"name":"바나나"},{"id":121,"name":"배"},{"id":123,"name":"감"}]' cntt
)
, copy_t AS
(
SELECT 0 no
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
)
SELECT b.no
     , JSON_EXTRACT(a.cntt, CONCAT('$[', b.no, '].id')) id
     , JSON_UNQUOTE(JSON_EXTRACT(a.cntt, CONCAT('$[', b.no, '].name'))) name
  FROM tb_tmp a
 INNER JOIN copy_t b
    ON b.no < JSON_LENGTH(a.cntt)
;

MySQL 8.0 이라면 JSON_TABLE() 사용이 가능할 듯 합니다.


by 오라클초보 [2021.09.28 22:41:59]

마농님. 답변 감사합니다.

많은 도움이 되었습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입