mysql json array 0 4 2,267

by 대한민국1 [MySQL] json [2023.03.17 20:14:11]


안녕하세요

json array 형태로 된 데이터집합에서 date 타입의 필드를 찾아서 1일씩 더해줘야 하는 UPDATE 쿼리 작업이 필요한데요..

해당 값은 table의 json 타입 필드로 들어가있고 필드명은 json_data입니다.

변경이 필요 한 json array 내부의 필드명은 startDate와 endDate입니다! 해당 필드는 null일 수 있으며, 데이터 형태는 다음과같습니다.

[{"fieldA": "12345", "fieldB": true, "fieldC": "a", "startDate": null, "endDate": null}]

혹시 위와같은 json array 형태의 데이터들을 update문으로 만드는 방법에 대하여 도움을 좀 받을 수 있을까요? ㅠㅠ

by jkson [2023.03.20 11:08:58]
-- 테스트 환경이 없어서 테스트 못 해봤습니다. 되는지 테스트해보세요.
UPDATE table
SET json_data = JSON_SET(json_data, '$[*].startDate', IFNULL(DATE_ADD(JSON_EXTRACT(json_data, '$[*].startDate'), INTERVAL 1 DAY), NULL)),
    json_data = JSON_SET(json_data, '$[*].endDate', IFNULL(DATE_ADD(JSON_EXTRACT(json_data, '$[*].endDate'), INTERVAL 1 DAY), NULL))
WHERE 조건

 


by 대한민국1 [2023.03.20 11:31:20]

Error Code: 3149. In this situation, path expressions may not contain the * and ** tokens or an array range.

답변감사합니다!. 위와같은 에러가 뜨네요 ㅠ


by jkson [2023.03.20 12:40:38]

$[*].startDate -> $[0].startDate 으로 해보면 어떤가요?


by 뉴비디비 [2023.03.20 18:45:45]
-- json data 추출 확인 :  = 'null' 부분은 IS NULL 로 될때도 있는거 같아서 적용하시면서 확인해보세요.
SELECT
	jdata
	, JSON_UNQUOTE(JSON_EXTRACT(jdata, '$[0].startDate')) AS "추출방식1"
	, jdata ->> '$[0].startDate' AS "추출방식2"
	, CASE WHEN jdata ->> '$[0].startDate' = 'null' THEN CURRENT_DATE() ELSE DATE_ADD(jdata ->> '$[0].startDate', INTERVAL 1 DAY) END AS newDate
FROM (
	SELECT '[{"fieldA": "12345", "fieldB": true, "fieldC": "a", "startDate": null, "endDate": null}]' AS jdata
	UNION ALL 
    SELECT '[{"fieldA": "34567", "fieldB": true, "fieldC": "a", "startDate": "2023-03-10", "endDate": null}]'
) jTbl

-- json data update
UPDATE jTbl 
	SET jdata = JSON_SET(jdata, '$[0].startDate', 
							CASE WHEN jdata ->> '$[0].startDate' = 'null' THEN CURRENT_DATE() ELSE  DATE_ADD( jdata ->> '$[0].startDate', INTERVAL 1 DAY) END 
						)
WHERE 필요한조건

 

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