SUBSTR 과 TRIM 을 적용하는 순서 0 4 2,347

by 배움 substr trim [2023.10.11 11:27:51]


오라클 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 만 뽑을 수 있다고 생각하는데 구글링을 해 봐도 잘 모르겠어서 질문 드립니다.


읽어주셔서 감사합니다.

by 마농 [2023.10.11 14:18:26]

제시해 주신 1번 구문은 괄호가 안맞는 듯 합니다.
TRIM 을 먼저 하나 SUBSTR 을 먼저 하나 차이 가 없을 듯 합니다.
SUBSTR 의 시작점은 유니코드 여부와 상관이 없이 1 입니다.
NVL 은 왜 문자 '0' 이 아닌 숫자 0 을 넣었을까요? 굳이 NVL 을 해야 할까요?
(6 CHAR) 로 설정된 컬럼에 6자 이상이 들어올 리가 없어 보이는데요? 6자 이상이 들어왔다고 판단하신 근거가 있나요?
혹시 (6 CHAR) 와 (6 BYTE) 를 착각하고 계신 것은 아닌지요?
소스가 (4 CHAR) 타겟이 (6 CHAR) 이면 SUBSTR 이 필요 없지 않나요?


by 배움 [2023.10.13 12:26:57]

본문 내용이 너무 잘못된 부분이 많은 것을 마농님의 댓글을 보고 알았습니다.

유저가 입력하는 부분에서 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번째 포지션부터 자르는 것을 이번에 처음 알았습니다. 앞으로 더 열심히 배우려고 합니다. 도움 되는 댓글 감사드립니다.

 


by 우주민 [2023.10.11 16:22:42]

내용의 디테일을 둘째 치고....

trim 을 먼저 하느냐, substr 을 먼저 하느냐의 내용 같은데...

해당 컬럼이 whitespace 로 시작하는 경우를 제외하고는 동일할거 같습니다.

trim 을 한다는 것은 whitespace 를 제거 할 목적일테니 substr 를 먼저 하고 trim 을 하게되면 자리수가 whitespace 로 시작한 수 만큼 줄어들겠죠.

trim 후에 substr 를 처리 하는 것이 맞는 방법처럼 보입니다.


by 배움 [2023.10.13 12:28:44]

댓글 감사합니다.

저도 함수를 중첩해서 적용하면 안에 있는 함수가 먼저 실행되어서 TRIM 이 먼저 수행될 것으로 생각했는데 구글링으로 딱 맞는 설명이나 예제를 찾지 못해서 질문을 올렸습니다.

디테일한 부분에서 많은 부족한 점이 있었는데 댓글로 잘 알려주셔서 정말 감사드립니다.

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