쿼리 질문드립니다! 1 5 1,649

by 찐찐유한 [SQL Query] [2023.04.17 17:00:40]


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": 뒤에 나오는 문자열 -> "애호박죽", "현미죽"

 

도대체 어떻게 쿼리문을 작성해야 위와 같이 집합형태의 레코드에서 제가 원하는 값만 추출할 수 있을까요?

 

(자사몰페이지@@@는 보안 상 임의로 바꿔넣은 문자열입니다.)

by 마농 [2023.04.17 17:43:00]

사용 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
;

 


by 찐찐유한 [2023.04.18 00:35:15]

좋은 답변 감사합니다! 혹시 mysql에서도 구현이 될까요?

 


by 동동동 [2023.04.17 18:34:21]
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 함수를 사용해 봤습니다.

 


by 찐찐유한 [2023.04.18 00:32:25]

좋은 답변 감사합니다! 근데, 제가 쓰고 있는 데이터베이스가 mysql인데 똑같이 적용 가능할까요?


by 마농 [2023.04.18 08:39:23]
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
;

 

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