안녕하세요
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문으로 만드는 방법에 대하여 도움을 좀 받을 수 있을까요? ㅠㅠ
-- 테스트 환경이 없어서 테스트 못 해봤습니다. 되는지 테스트해보세요. 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 조건
-- 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 필요한조건