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자 이후의 데이터, 데이터가 단어로 되어있는데
한단어는 연결되어야합니다.
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을 넘어 에러를 유발한 가능성을 내포하고 있다는 점 입니다.
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자리를 넘기게 됩니다.