REPLACE 나 TRANSLATE 말고 다른 문자열 치환함수가 있을까요?? 0 9 1,957

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 함수를 못찾겠네요..ㅜ

혹시 관련된 함수 나 다른 방법을 알고 계시는 분있으시면 조언좀 부탁드립니다..ㅜ

by ReLight [2016.06.21 10:52:35]

자체 해결했습니다.

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로 바꿔줬네요~


by 마농 [2016.06.21 11:20:22]

원본 대비 결과표를 보여주세요.

사용하신 쿼리는 오류 가능성이 농후해 보이네요.


by ReLight [2016.06.21 13:10:35]

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

 


by 마농 [2016.06.21 13:29:56]

1. 항상 1~9 숫자만 들어오나요? 혹시 0이 들어오지는 않나요?

2. 말씀대로라면 7,8,9 번째 자리는 무의미하게 항상 'NNN' 으로 표시되겠네요?


by ReLight [2016.06.21 15:07:03]

1. 넵 1~9만 들어옵니다.

2. 네 사실 저게 각각의 화면 2개랑 연동시키고 있는건데

연동을 받는 화면은 저 플래그가 하나의 컬럼('NNYYYNNYN')을 기준으로 해서 보여지게 되어져 있고

보내는 화면은 여러개의 컬럼으로 나눠져있어서 저작업을 하고 있었어요~

조회 해올때 7,8,9번째는 N으로 나와야되는게 맞습니다.


by jkson [2016.06.21 13:37:28]

WITH T AS
(
SELECT '1' A_CAN, '5' B_CAN, '7' C_CAN FROM DUAL
)
SELECT REGEXP_REPLACE(TRANSLATE('123456789X'
                    , TRANSLATE(A_CAN, '789', 'XXX') 
                   || TRANSLATE(B_CAN, '789', 'XXX') 
                   || TRANSLATE(C_CAN, '789', 'XXX'), 'YYY')
                    , '[[:digit:]]', 'N') GUBN
  FROM T

살짝 쿼리를 줄여봤습니다.


by ReLight [2016.06.21 15:07:58]

아 네 감사합니다~

분석해보고 저도 사용해봐야겠네요!!!^^


by 마농 [2016.06.21 15:21:15]
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
;

 


by ReLight [2016.06.22 11:40:16]

쿼리 감사합니다.^^

이것도 한번 참고 해보도록 할께요~

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