문자컬럼 일부분만 update 0 3 1,459

by 마늘장아찌 [2017.01.16 17:19:16]


VARCHAR2(4000) 컬럼상에 값이

0001000200140005 이런식으로 4자리 foramt으로 붙어서 들어있습니다.

예를들면 0002값을 0003으로 변경 하고저 한다면 update시에 해당 컬럼을 읽어서

4자리씩 끊고 해당 구간의 값을 변경후 나머지 값들을 붙여서 컬럼값으로 update 하는 방법밖에는 없는지요?

오라클 11g r2 버전입니다.

 

 

by 우리집아찌 [2017.01.16 17:33:48]
WITH T ( VAL ) AS (
  SELECT '0001000200140005' FROM DUAL 
)

SELECT  REGEXP_SUBSTR(VAL, '(.){4}' , 1 , 1 )  VAL1
     ,  REGEXP_SUBSTR(VAL, '(.){4}' , 1 , 2 )  VAL2   
     ,  REGEXP_SUBSTR(VAL, '(.){4}' , 1 , 3 )  VAL3  
     ,  REGEXP_SUBSTR(VAL, '(.){4}' , 1 , 4 )  VAL4 
     -- concat 
     ,  REGEXP_SUBSTR(VAL, '(.){4}' , 1 , 1 )  ||
        '0003'  ||   
        REGEXP_SUBSTR(VAL, '(.){4}' , 1 , 3 )  ||  
        REGEXP_SUBSTR(VAL, '(.){4}' , 1 , 4 )  TOT_VAL 
     -- replace
     , REGEXP_REPLACE(VAL, '(\d{4})(\d{4})(\d{4})(\d{4})' , '\10003\3\4' ) 
  FROM  T 

 


by 마늘장아찌 [2017.01.16 17:57:33]

감사합니다. REGEXP_REPLACE 써볼까 하는데요...

문제는 해당 컬럼이 자리수가 크다 보니 4자리씩 600 = 2400 자리까지 갈수 있습니다.

몇자리 안되면 저런식으로 해보겠는데 일단 파라미터로 변경하고자 하는 위치는 받을 수있습니다.

위의 예를 보자면 2번째를 알수는 있거든요

이경우 2번째부터 4자리만 replace해서 update 할수 있으면 됩니다만...


by 우리집아찌 [2017.01.16 18:11:37]
-- 양이 많고 하나만 고치신다면..
WITH T ( VAL ) AS (
  SELECT '0001000200140005' FROM DUAL 
)
-- :no 몇번째 값
SELECT SUBSTR(VAL, 1 , 4 * ( :NO - 1 )  )  || '0003' ||  SUBSTR(VAL, 4 * ( :NO )  + 1  , LENGTH(VAL) )
  FROM T 

 

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