by dkfldkfl [2018.11.09 16:55:17]
날짜-1, 날짜-2, 날짜-3 형식으로 ID 를 세팅하려고 합니다
이때 현재 날짜를 넣어서 그 날짜의 최대값을 가져오게 하고 싶습니다
2018/11/09 를 넣었어요
DB에 2018/11/09-1 이 있다면 2018/11/09-2 를 반환하고
2018/11/09-9가 있다면 2018/11/09-10 을 반환하는 방식입니다
php 단에서 가능할까요?
WITH t AS ( SELECT '2018/11/11-1' id FROM dual UNION ALL SELECT '2018/11/11-2' FROM dual --UNION ALL SELECT '2018/11/12-1' FROM dual ) -- 숫자가 1자리를 넘지 않을 경우를 가정 SELECT TO_CHAR(sysdate, 'yyyy/mm/dd') || '-' || NVL(SUBSTR(MAX(id), 12) + 1, 1) next_id FROM t WHERE id LIKE TO_CHAR(sysdate, 'yyyy/mm/dd')||'%' ;
MAX 를 효율적으로 이용하려면 뒤에 숫자부분이 고정자리수 이어야 합니다.
가변 자리수 인 경우 그냥 MAX 로는 안되어 가공을 해야 하고
가공을 하면 인덱스 효율이 떨어집니다.
WITH t AS ( SELECT '2018/11/11-1' id FROM dual UNION ALL SELECT '2018/11/11-2' FROM dual UNION ALL SELECT '2018/11/12-1' FROM dual UNION ALL SELECT '2018/11/12-9' FROM dual UNION ALL SELECT '2018/11/12-10' FROM dual ) -- 숫자가 가변 자리인 경우. MAX 쿼리 비효율 발생. SELECT TO_CHAR(sysdate, 'yyyy/mm/dd') || '-' || NVL(MAX(SUBSTR(id, 12) + 1), 1) next_id FROM t WHERE id LIKE TO_CHAR(sysdate, 'yyyy/mm/dd')||'%' ;