데이터 자르기 질문 0 3 1,553

by bellpp [2022.05.04 10:05:24]


dbms : oracle 12c

asis 컬럼 A varchar(200)
tobe 컬럼 a varchar(100), b varchar(100)

asis 1~ 200자인 컬럼의 데이터를 잘라 tobe에 넣으려고합니다.

100자가 넘어가면 a,b컬럼에 나누어 100자 미만이면 a컬럼에만 넣습니다.

넣는 방법은 insert into select 구문을 통해서 넣으려고합니다.

데이터 구분자는 ,로 되어있습니다. function을 만들려고 하는데 감이 안잡힙니다.

ex) asis 데이터 1,2,3,4,5, ~~~
100자 넘어갈시 a 컬럼에 1,2,3,~~ 100자까지 b컬럼에 100자 이후의 데이터, 데이터가 단어로 되어있는데

한단어는 연결되어야합니다.

by 우주민 [2022.05.04 10:21:37]
SELECT 
 CASE WHEN LENGTH(A) > 100 
      THEN SUBSTR(A,1,instr(substr(A,1,100),',',-1)) 
      ELSE A END AS a
,CASE WHEN LENGTH(A) > 100 
      THEN SUBSTR(A,instr(substr(A,1,100),',',-1)+1)
      ELSE NULL END AS b
FROM 대상 테이블

 

오라클 테스트가 안되어서 정확하진 않지만 이런 식으로 처리가 가능하지 않을까 싶습니다.

작업 컨셉

1. 길이가 100 이하일 경우 a컬럼에 전부 넣고 b에는 null

2. 길이가 100 이상일 경우

  2-1. A컬럼을 100 자로 자름

  2-2. 잘린 데이터 중에 구분자 ','를 뒤에서 부터 찾음

  2-3. 해당 구분자를 기준으로 a / b 컬럼을 나눔

 

이 로직의 문제점은 원본 데이터의 LENGTH 가 200 이고(혹은 200에 가깝고), 100번째 글자가 구분자가 아닐 경우 b 쪽에 LENGTH 가 100을 넘어 에러를 유발한 가능성을 내포하고 있다는 점 입니다.


by bellpp [2022.05.04 11:16:58]

감사합니다. 정상적으로 결과나옵니다.


by 마농 [2022.05.04 12:48:05]
WITH t AS
(
          SELECT '1,2,3,4,5' a          FROM dual  -- 1,2,3,4,5  | 
UNION ALL SELECT '1,2,3,4,5,6,7,8,9,10' FROM dual  -- 1,2,3,4,5  | 6,7,8,9,10
UNION ALL SELECT '1,2,3,4,55,6,7,8,9,0' FROM dual  -- 1,2,3,4,55 | 6,7,8,9,0
UNION ALL SELECT '1,2,3,4,555,6,7,8,90' FROM dual  -- 1,2,3,4    | 555,6,7,8,90
)
SELECT a
     , SUBSTRB(a, 1, p - 1) x
     , SUBSTRB(a,    p + 1) y
  FROM (SELECT a
             , INSTR(SUBSTRB(a || ',', 1, 10 + 1), ',', -1) p
          FROM t
        )
;
-- 10 자리 자르기 예시입니다.
-- 4행의 경우 2번째 값이 10자리를 넘기게 됩니다.

 

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