오라클 SYSDATE + SEQUENCE 0 5 1,626

by 케빈재브라위너 [SQL Query] [2021.02.05 13:26:00]


해야할 일 

QA_BOARD 테이블의 PK인 QA_NO를 만들어주는 쿼리가 필요합니다.

 

SELECT CONCAT(TO_CHAR(SYSDATE,'YYYYMMDD'),LPAD(QA_BOARD_SEQ.NEXTVAL,4,0))
 QA_NO
FROM DUAL

시퀀스 이용해서 만들어서 사용했는데 시퀀스로 하지말라고 하셔서... 어차피 위의 쿼리처럼하면 날짜가 바뀌어도 초기화가 안되서요...

202102050000

202102050001

202102050002

202102050003

202102050004

202102060000

202102060001

202102060002

202102060003

이런식으로 SYSDATE YYYYMMDD뒤에 0000부터 시퀀스 없이 1씩 늘어나게끔 할수 있는 쿼리가 있나요?

추가로 날짜가 바뀌면 다시 0000부터 시작할수 있게끔 할수 있나요..?

by 마농 [2021.02.05 14:12:35]
SELECT TO_CHAR(sysdate, 'yyyymmdd')
    || LPAD(NVL(SUBSTR(MAX(qa_no), -4) + 1, 0), 4, '0') AS qa_no
  FROM qa_board
 WHERE qa_no >= TO_CHAR(sysdate, 'yyyymmdd') || '0000'
   AND qa_no <  TO_CHAR(sysdate, 'yyyymmdd') || '9999'
;

 


by 케빈재브라위너 [2021.02.05 15:05:49]
"/*com.sds.idps.qa.qaDAO.getQABoardPk*/
SELECT
    TO_NUMBER(NVL(MAX(QA_NO)+1, TO_CHAR(SYSDATE, 'YYYYMMDD') || '0000')) AS QA_NO
FROM TB_QA_BOARD
WHERE QA_NO >= TO_NUMBER(TO_CHAR(SYSDATE, 'YYYYMMDD') || '0000')"

 

이게 제가 겨우겨우 끼워맞추기식으로 만든건데 

이거랑 마농님꺼랑 어떤부분에서 차이가 나나요??

제가 지금 작성한거로는 에러라던가 오동작할 특정한 경우의수를 고려하지않은채로 돌아가고있는건가요??

마농님꺼 갖다 쓸건데 그래도 이유라도 좀 알고 갖다쓰고 싶어서요 ㅠㅠ 공부할겸


by 마농 [2021.02.05 15:33:01]

qa_no 의 자료형이 뭘까요? 데이터 타입에 맞게 작성해야 합니다.
저는 문자형이라 가정하고 답변 드렸습니다.
숫자형이라면 to_number 를 붙여주는게 맞습니다.
작성하신 쿼리는 작은 부분에서 차이가 좀 나긴 하지만. 문제 없어 보입니다.


by 케빈재브라위너 [2021.02.08 07:48:47]

아...자료형.... 그부분을 언급을 안드렸네요... 

데이터 타입이라는게 엄청 중요한건데.. 이런거 앞으로는 놓치지않을게요 

데이터타입이 NUMBER형식입니다

근데 마농님이 작성해주신거로 쿼리 집어넣었는데 엄청 잘돌아갑니다 ㅎㅎㅎㅎ

그리고 시퀀스가 없어서 9999라는것으로 한도를 제한해주신거같은데 

그런 부분도 신경써서 해볼게요 앞으로는

 

정말 감사합니다 덕분에 여러가지 오라클함수를 연달아서 이렇게 쓸수있구나도 배웠습니다!!!!!♡


by 마농 [2021.02.08 08:55:50]

문자 숫자 비교시 문자가 숫자로 자동 형변환 됩니다.
숫자컬럼에 문자조건을 줘도 문제 없는 이유입니다.
문제가 없다고 해도 이왕이면 자료형을 맞춰 주는게 좋습니다.
반대로 문자 컬럼에 숫자 조건 주면 문제가 됩니다.

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