안녕하세요
json array 형태로 된 데이터집합에서 date 타입의 필드를 찾아서 1일씩 더해줘야 하는 UPDATE 쿼리 작업이 필요한데요..
해당 값은 table의 json 타입 필드로 들어가있고 필드명은 json_data입니다.
변경이 필요 한 json array 내부의 필드명은 startDate와 endDate입니다! 해당 필드는 null일 수 있으며, 데이터 형태는 다음과같습니다.
1 | [{ "fieldA" : "12345" , "fieldB" : true , "fieldC" : "a" , "startDate" : null , "endDate" : null }] |
혹시 위와같은 json array 형태의 데이터들을 update문으로 만드는 방법에 대하여 도움을 좀 받을 수 있을까요? ㅠㅠ
1 2 3 4 5 | -- 테스트 환경이 없어서 테스트 못 해봤습니다. 되는지 테스트해보세요. 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 조건 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | -- 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 필요한조건 |