오라클 Source 테이블에서 들어오는 Column_A 는 Unicode 이고 최대 4 characters 입니다.
오라클 Target 테이블에 있는 Column_A의 데이터 타입은 VARCHAR2(6 CHAR) 인데요.
그런데 Column_A 의 length 보다 긴 string 이 들어온 게 있어서 자르려고 합니다.
이 때 whitespace 를 허용하지 않으면서 길이에 맞게 자르고 NVL 함수를 적용하고 싶습니다.
만일 NVL 함수까지 적용해서 최종적으로 COLUMN_A 에 값을 할당한다면 다음 2개 중에 어떤 방법이 가장 나으며 그 이유는 무엇인지 궁금합니다.
/* 1 번 */ NVL(SUBSTR(TRIM(A, 1,6)), 0) /* 2 번 */ NVL(TRIM(SUBSTR(A,1,6)), 0)
저는 안에 있는 함수가 먼저 실행되어서 TRIM 을 먼저 하고 whitespace 가 없어진 string 에 대해 SUBSTR 을 해 줘야 원하는 string 만 뽑을 수 있다고 생각하는데 구글링을 해 봐도 잘 모르겠어서 질문 드립니다.
읽어주셔서 감사합니다.
제시해 주신 1번 구문은 괄호가 안맞는 듯 합니다.
TRIM 을 먼저 하나 SUBSTR 을 먼저 하나 차이 가 없을 듯 합니다.
SUBSTR 의 시작점은 유니코드 여부와 상관이 없이 1 입니다.
NVL 은 왜 문자 '0' 이 아닌 숫자 0 을 넣었을까요? 굳이 NVL 을 해야 할까요?
(6 CHAR) 로 설정된 컬럼에 6자 이상이 들어올 리가 없어 보이는데요? 6자 이상이 들어왔다고 판단하신 근거가 있나요?
혹시 (6 CHAR) 와 (6 BYTE) 를 착각하고 계신 것은 아닌지요?
소스가 (4 CHAR) 타겟이 (6 CHAR) 이면 SUBSTR 이 필요 없지 않나요?
본문 내용이 너무 잘못된 부분이 많은 것을 마농님의 댓글을 보고 알았습니다.
유저가 입력하는 부분에서 6 char 로 들어오는데 중간에 그것을 4 char 까지만 허용하는 로직이 있습니다.
그래서 그 로직을 통과할 때 입력된 string 의 length 가 6이기 때문에 ORA-1406 error 가 났습니다. 여기서 부터 제가 보기 시작했는데요.
저는 그 SUBSTR 해서 타겟 테이블까지 4 char 를 넘겼습니다. 근데 SUBSTR 함수를 추가하기 전, 레거시 코드에 TRIM 과 NVL 이 적용되어 있었고 제가 급히 고민하다가 질문을 남기며 많은 구멍이 있었습니다.
SUBSTR (string, 0, 4) 을 넣어도 0 이 1의 alias 이며 0도 1번째 포지션부터 자르는 것을 이번에 처음 알았습니다. 앞으로 더 열심히 배우려고 합니다. 도움 되는 댓글 감사드립니다.