안녕하세요
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 조건
Error Code: 3149. In this situation, path expressions may not contain the * and ** tokens or an array range.
답변감사합니다!. 위와같은 에러가 뜨네요 ㅠ
$[*].startDate -> $[0].startDate 으로 해보면 어떤가요?
-- 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 필요한조건