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 함수를 사용해 봤습니다.