쿠폰 번호를 디비에서 시퀀스를 써서 번호를 매겨야 하는데, 처음에 안 만들어서,
디비에서 최고 높은 값을 찾아서, +1를 해주고, 다시 앞에 'U' 붙이고, 0000 붙여서 자릿수를 맞춰 주고 싶을때 쓰는거다.
밑에 예시처럼.
U0000001
U0000039
U0000040
select 'U'||substr('000000000'||to_char(max(to_number(replace(nvl(coupon_cd,'0'),'U',''))) + 1),-9,9) max_coupon
from tk_coupon
처음에
select replace(coupon_cd, 'U', '') from tk_coupon; //앞에 'U'를 제거해줌.
select to_number(replace(coupon_cd, 'U', '')) from tk_coupon; //스트링을 넘버로 바꿔줌.
select to_number(replace(nvl(coupon_cd, '0'), 'U', '')) from tk_coupon; //nvl 혹시 모르니, nvl를 써서, null값을 0으로 바꿔줌.
select max(to_number(replace(nvl(coupon_cd, '0'), 'U', ''))) from tk_coupon; //그 다음에, 그중에서 max로 최대값을 찾아줌.
select max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1 from tk_coupon; //거기에 1를 더해줌.
select to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1) from tk_coupon; //다시 number에서, char로 바꿔줌.
select '000000000'||to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1) from tk_coupon; //앞에 0000000를 자리수 맞게 붙여줌. 0000000004 이렇게 됨. 그래서 앞에 한자리를 지워줘야함.
//혹시 모르니, 11이 됬을때는, 0를 하나 더 지워주어야 함. 그래서 substr( [값], [시작자리수], [자리수갯수] )를 써서, 앞에를 잘라줌. 시작 자릿수에 (-)를 붙였을때는 뒤에서 부터 시작임.
select substr('000000000'||to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1), -9.9) from tk_coupon;
위에서부터, 9자릿수까지함.
//그 다음에 앞에 U를 붙여주면됨.
select 'U'||substr('000000000'||to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1), -9.9) from tk_coupon;
값 : U000000005
//칼럼 이름이 너무 길므로, 뒤에 max를 붙여서 이름을 바꿔준다.
select 'U'||substr('000000000'||to_char(max(to_number(replace(nvl(coupon_cd, '0'), 'U', '')))+1), -9.9) max from tk_coupon;
아니면, 쉽게 to_char 만 쓰는 법도 있다.
select 'U'||trim(to_char(to_number('1234556') + 1,'000000000')) max_coupon
from dual;
to_char로 자릿수 잡아주는거다.하지만, trim를 써서, 빈칸을 없애줘야한다.
'컴퓨터 > Oracle' 카테고리의 다른 글
ORA-21561 : OID generation failed 오라클 에러 (0) | 2021.07.20 |
---|---|
오라클 시간차이 계산하기 (0) | 2019.10.31 |
오라클 데이터값 오늘 날짜 검색 (0) | 2018.04.27 |
오라클 백업하기(쉘 스크립트로) (0) | 2018.04.24 |
오라클 백업시(exp) 에러 EXP-00056 / ORA-21561 (0) | 2018.04.24 |