max값 + 1 에 대한 질문 입니다. 0 5 1,755

by 동안이 [2015.12.09 11:53:04]


TB_APPSAMPLE 이란 테이블에

APP_ID(number)    P_ID(number)   E_SNO(number)

       27                   364976        273649769

이렇게 3개의 컬럼이 있는데.

컬럼 E_SNO 에 쿼리로 27364976910 값을 넣을려고 합니다.

값이 들어 가는 규칙은  APP_ID + P_ID + 1부터 시작하는 MAX 값인데

아래 쿼리에서 #read_appid#||#p_id#||NVL(MAX(TO_NUMBER(E_SNO)), 0) + 1) 이 부분에서

위와 같이 데이터가 나올경우에 NUMBER 형 이다 보니 문제가 발생합니다. 273649769 + 1 이 되서

273649770 이 되어 버리는데 이걸 2736497610 이 되게 할 수는 없을까요?

 

SELECT NVL2(max(E_SNO), NVL(MAX(TO_NUMBER(E_SNO)), 0) + 1, #read_appid#||#p_id#||NVL(MAX(TO_NUMBER(E_SNO)), 0) + 1)
     FROM TB_READAPPMAILHIST WHERE E_SNO LIKE #read_appid ||#p_id#||'%'

 

 

by 우리집아찌 [2015.12.09 13:07:11]
WITH T AS (
SELECT 27 APP_ID , 364976 P_ID , 273649768 E_SNO FROM DUAL UNION ALL
SELECT 27 APP_ID , 364976 P_ID , 273649769 E_SNO FROM DUAL
)

SELECT TO_CHAR(APP_ID || P_ID) ||
       TO_CHAR(SUBSTR(E_SNO,LENGTH(APP_ID||P_ID)+1,LENGTH(E_SNO)) + 1 ) MAX_E_SNO
  FROM 
(SELECT APP_ID 
        ,P_ID
        ,E_SNO
        ,ROW_NUMBER() OVER(ORDER BY E_SNO DESC ) RN
    FROM T        
)WHERE RN = 1
        

 


by 동안이 [2015.12.10 10:54:57]

SUBSTR 로 잘라서 하면 되는 군요. 감사합니다!! ^^


by 마농 [2015.12.09 14:24:55]

일련번호를 따기 위해서는 자리수가 일정해야 합니다.
뒤에 9 다음 10 이 붙는 형태로 자리수가 늘어나면 여러모로 곤란합니다.
MAX 값을 가져오는데도 엉뚱하게 되어 버릴 수 있구요.
숫자 항목에 검색조건을 LIKE 로 걸면 인덱스를 효율적으로 사용하지 못하게 됩니다.
뒤에 순번을 3자리 정도로 고정하여 사용하는것을 고려해 보세요.
그리고, 뒤 순번 뿐만 아니라 앞에 두가지 값을 붙이는 부분도 마찬가지입니다.
자리수가 일정하지 않다면 여러가지 문제가 발생될 가능성이 있습니다.


예를 들면
1 번에 11 번을 붙이는 경우와
11번에 1번을 붙이는 경우가 존재한다면?
둘다 111 로 시작하여 구별이 안가게 됩니다.


by 동안이 [2015.12.10 11:06:22]

마농님 조언 감사합니다!! ^^  조언해 주신 부분에 대해서 설계자랑 얘기해봐야 겠습니다.

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