by ReLight [SQL Query] 문자열 치환 [2016.06.21 10:32:41]
안녕하세요.
지금 토글 기능을 만들고 있는데
데이터가 1일때 부터 9일때
1이면 첫번째에 Y
2이면 두번째에 Y
...
마지막까지 다합쳐서 결과로는 NYNNNYNNN 이런 문자열이 나오게 하려는데요.
지금 비슷하게 한것은 decode를 활용해서
decode(a_can, '1', 1000000000, '2', 0100000000, '3', 0010000000 , '4', 0001000000, '5', 0000100000, '6', 0000010000 , '7', 0000000001, '8', 0000000001, '9', 0000000001 , 0) + decode(b_can, '1', 1000000000, '2', 0100000000, '3', 0010000000 , '4', 0001000000, '5', 0000100000, '6', 0000010000 , '7', 0000000001, '8', 0000000001, '9', 0000000001 , 0) + decode(c_can, '1', 1000000000, '2', 0100000000, '3', 0010000000 , '4', 0001000000, '5', 0000100000, '6', 0000010000 , '7', 0000000001, '8', 0000000001, '9', 0000000001 , 0) as gubn 결과 tot_flag - 100200004
여기까지 했거든요.
이제 여기서 0은 N으로 나머지는 Y로 해야되는데 나머지를 Y로 바꿀수 있는
oracle 함수를 못찾겠네요..ㅜ
혹시 관련된 함수 나 다른 방법을 알고 계시는 분있으시면 조언좀 부탁드립니다..ㅜ
자체 해결했습니다.
Regexp_Replace( repalce( lpad( decode(a_can, '1', 1000000000, '2', 0100000000, '3', 0010000000 , '4', 0001000000, '5', 0000100000, '6', 0000010000 , '7', 0000000001, '8', 0000000001, '9', 0000000001 , 0) + decode(b_can, '1', 1000000000, '2', 0100000000, '3', 0010000000 , '4', 0001000000, '5', 0000100000, '6', 0000010000 , '7', 0000000001, '8', 0000000001, '9', 0000000001 , 0) + decode(c_can, '1', 1000000000, '2', 0100000000, '3', 0010000000 , '4', 0001000000, '5', 0000100000, '6', 0000010000 , '7', 0000000001, '8', 0000000001, '9', 0000000001 , 0), 10, '0' ), 0, 'N' ), '[[:digit:]]', 'Y') as gubn
Replace써서 0을 먼저 문자 N으로 바꾸고
Regexp_Replace써서 정규식으로 숫자를 Y로 바꿔줬네요~
TABLE 명 : TEMP
컬럼 : a_can - 1~9까지 숫자가 들어가있음.
b_can - 1~9까지 숫자가 들어가있음.
c_can - 1~9까지 숫자가 들어가있음.
저장된 데이터 1~9 숫자는 각각의 의미가 있음.
ex) 1 걷기, 2 달리기, 3 자전거, 4 오토바이, 5 소형차, 6 중형차, 7 대형차, 8 선박, 9 항공
3개의 컬럼중에서 하나라도 속해있으면 Y, 없으면 N 표시되어
컬럼 한개로 표시해줌. ( 표시 컬럼에는 10가지 종류가 표현되어야함. )
표시 컬럼
NNNYYYNNYN -> 10개로 표시
TEMP 테이블의 데이터 중 7~9번은 통합컬럼 표시할때는 10번째에 Y가 되도록 함.
해야되는 것은 이렇게 정리를 했었습니다.
정리를 하면 3개의 컬럼에 있는 데이터를 한개의 컬럼으로 바꿔주는데
데이터를 그대로 합치지 않고 각 숫자의 자릿수 표시를 해서 보여주는게 목적이였어요.
temp a_can b_can c_can 1 5 7 select Regexp_Replace( repalce( lpad( decode(a_can, '1', 1000000000, '2', 0100000000, '3', 0010000000 , '4', 0001000000, '5', 0000100000, '6', 0000010000 , '7', 0000000001, '8', 0000000001, '9', 0000000001 , 0) + decode(b_can, '1', 1000000000, '2', 0100000000, '3', 0010000000 , '4', 0001000000, '5', 0000100000, '6', 0000010000 , '7', 0000000001, '8', 0000000001, '9', 0000000001 , 0) + decode(c_can, '1', 1000000000, '2', 0100000000, '3', 0010000000 , '4', 0001000000, '5', 0000100000, '6', 0000010000 , '7', 0000000001, '8', 0000000001, '9', 0000000001 , 0), 10, '0' ), 0, 'N' ), '[[:digit:]]', 'Y') as gubn from temp 결과 : gubn = YNNNYNNNNY
WITH sample_t AS ( SELECT a_can, b_can, c_can FROM (SELECT LEVEL a_can FROM dual CONNECT BY LEVEL <= 9) , (SELECT LEVEL b_can FROM dual CONNECT BY LEVEL <= 9) , (SELECT LEVEL c_can FROM dual CONNECT BY LEVEL <= 9) ) SELECT a_can, b_can, c_can , REGEXP_REPLACE(TRANSLATE('123456NNN7' , TRANSLATE(a_can||b_can||c_can, '89', '77'), 'YYY') , '[^Y]', 'N') x FROM sample_t ;