2018/11/09-3 이 있으면 2018/11/09-4 를 반환하고 없으면 2018/11/09 -1 을 반환하기? 0 2 114

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 단에서 가능할까요?

by 마농 [2018.11.12 11:07:15]
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')||'%'
;

 


by 마농 [2018.11.12 13:22:50]

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')||'%'
;

 

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