meal이라는 필드에
[{"set_cnt":1,"set_meal":[{"day_of_week":"thu","pid":"0000010010","pname":"애호박죽","pimg":자사몰페이지@@@,"al_matter":[""],"is_care":false,"qty":1,"group":"2023-02-2343010_10","start_group":true,"end_group":false,"max_qty":"1"}]},{"set_cnt":1,"set_meal":[{"day_of_week":"wed","pid":"0000010014","pname":"현미죽","pimg"자사몰페이지@@@"al_matter":[""],"is_care":false,"qty":1,"group":"2023-03-0134110_10","start_group":true,"end_group":false,"max_qty":"1"}]}]
이렇게 레코드가 들어가 있습니다.
여기서 추출하고 싶은 값은 아래와 같습니다.
"set_cnt": 뒤에 나오는 숫자 -> 1, 1
"pname": 뒤에 나오는 문자열 -> "애호박죽", "현미죽"
도대체 어떻게 쿼리문을 작성해야 위와 같이 집합형태의 레코드에서 제가 원하는 값만 추출할 수 있을까요?
(자사몰페이지@@@는 보안 상 임의로 바꿔넣은 문자열입니다.)
사용 DBMS 및 버전에 따라 구현방법이 다를 수 있습니다.
WITH t AS ( SELECT '[{"set_cnt":1,"set_meal":[{"day_of_week":"thu","pid":"0000010010","pname":"애호박죽","pimg":자사몰페이지@@@,"al_matter":[""],"is_care":false,"qty":1,"group":"2023-02-2343010_10","start_group":true,"end_group":false,"max_qty":"1"}]},{"set_cnt":1,"set_meal":[{"day_of_week":"wed","pid":"0000010014","pname":"현미죽","pimg"자사몰페이지@@@"al_matter":[""],"is_care":false,"qty":1,"group":"2023-03-0134110_10","start_group":true,"end_group":false,"max_qty":"1"}]}]' AS meal FROM dual ) -- Oracle 정규식 이용 예 -- SELECT RTRIM(REPLACE(REGEXP_REPLACE(meal, '("set_cnt":[^,]+,)|.', '\1'), '"set_cnt":'), ',') set_cnt , RTRIM(REPLACE(REGEXP_REPLACE(meal, '("pname":[^,]+,)|.', '\1'), '"pname":'), ',') pname FROM t ;
WITH JSON_TBL AS (SELECT '[{ "set_cnt": 1, "set_meal": [{ "day_of_week": "thu", "pid": "0000010010", "pname": "애호박죽", "pimg": "자사몰페이지 @ @ @", "al_matter": [""], "is_care": false, "qty": 1, "group": "2023-02-2343010_10", "start_group": true, "end_group": false, "max_qty": "1" }] }, { "set_cnt": 3, "set_meal": [{ "day_of_week": "wed", "pid": "0000010014", "pname": "현미죽", "pimg": "자사몰페이지 @ @ @", "al_matter": [""], "is_care": false, "qty": 1, "group": "2023-03-0134110_10", "start_group": true, "end_group": false, "max_qty": "1" }] }]' J_VAL FROM DUAL ) SELECT MEAL_INFO.* FROM JSON_TBL , JSON_TABLE(J_VAL, '$[*]' -- 전체는: [*] COLUMNS ( row_number FOR ORDINALITY , set_cnt VARCHAR2(100) PATH '$.set_cnt' , day_of_week VARCHAR2(100) PATH '$.set_meal[*].day_of_week' , pid VARCHAR2(100) PATH '$.set_meal[*].pid' , pname VARCHAR2(100) PATH '$.set_meal[*].pname' ) ) AS MEAL_INFO ;
오라클 JSON 함수를 사용해 봤습니다.
WITH t AS ( SELECT '[{"set_cnt":1,"set_meal":[{"day_of_week":"thu","pid":"0000010010","pname":"애호박죽","pimg":자사몰페이지@@@,"al_matter":[""],"is_care":false,"qty":1,"group":"2023-02-2343010_10","start_group":true,"end_group":false,"max_qty":"1"}]},{"set_cnt":1,"set_meal":[{"day_of_week":"wed","pid":"0000010014","pname":"현미죽","pimg"자사몰페이지@@@"al_matter":[""],"is_care":false,"qty":1,"group":"2023-03-0134110_10","start_group":true,"end_group":false,"max_qty":"1"}]}]' AS meal ) -- MariaDB 10.4 정규식 이용 예 -- SELECT SUBSTR(REPLACE(REGEXP_REPLACE(meal, '("set_cnt":[^,]+)|.', '\\1'), '"set_cnt":', ','), 2) set_cnt , SUBSTR(REPLACE(REGEXP_REPLACE(meal, '("pname":[^,]+)|.', '\\1'), '"pname":', ','), 2) pname FROM t ;