오라클 함수중에 trim,ltrim,rtrim 이 있습니다.

ltrim과 rtrim 함수를 포함한 것이 trim함수라고 생각할수도 있겠지만
정확하게는 그렇지 않습니다.

우선 일반적으로 알고 있는 ltrim,rtrim,trim 에 대한 사용용도 입니다.



select ltrim('aabacdbaeaa' , 'a') from dual;
==>bacdbaeaa

select trim(leading 'a' from 'aabacdbaeaa') from dual;
==>bacdbaeaa



select rtrim('aabacdbaeaa' , 'a') from dual;
==>aabacdbae

select trim(trailing 'a' from 'aabacdbaeaa') from dual;
==>aabacdbae


select trim(both 'a' from 'aabacdbaeaa') from dual; ( = select trim('a' from 'aabacdbaeaa') from dual;)
==>bacdbae


위 쿼리들은 모두 왼쪽이든 오른쪽이든 양쪽이든 'a' 라는 문자를 없애는 쿼리 입니다.

그럼 스페이스를 없애는 쿼리는 ...예 간단하게 'a' 부분을 ' ' 처럼 빈 공간을 넣거나 아니면 
더 간단히 trim source만 입력하면 됩니다.

select trim(both ' ' from ' aabacdbaeaa ') from dual; ( = select trim(' aabacdbaeaa ') from dual;)
==>aabacdbaeaa

select ltrim(' aabacdbaeaa ',' ') from dual; (select ltrim(' aabacdbaeaa ') from dual;)
==>aabacdbaeaa_ (_는 빈 공간입니다.)

select rtrim(' aabacdbaeaa ',' ') from dual; (select rtrim(' aabacdbaeaa ') from dual;)
==>_aabacdbaeaa (_는 빈 공간입니다.)

그럼 trim source 나 trim set 중에 하나가 null 인 경우는 어떤 값을 리턴할까요..
예 바로 null을 리턴합니다.

아래 쿼리 모두 결과값은 'IS NULL' 입니다.

select Nvl( trim('' from 'abc'),'IS NULL') from dual;
select Nvl( trim('a' from ''),'IS NULL') from dual;
select Nvl( trim('' from ''),'IS NULL') from dual;
select Nvl( trim(''),'IS NULL') from dual;
select Nvl( ltrim('abc',''),'IS NULL') from dual;
select Nvl( ltrim('','a'),'IS NULL') from dual;
select Nvl( ltrim('',''),'IS NULL') from dual;
select Nvl( ltrim(''),'IS NULL') from dual;

==> IS NULL

그럼 ltrim,rtrim 과 trim의 결정적인 차이점은 무엇일까요..
바로 trim set 의 글자수 제한입니다.

trim 함수에 적용해 보면 다음과 같은 에러가 납니다.
SQL> select Nvl( trim('abc' from 'abc'),'IS NULL') from dual;
select Nvl( trim('abc' from 'abc'),'IS NULL') from dual
            *
ERROR at line 1:
ORA-30001: trim set should have only one character

only one 이라는 군요..

그럼 ltrim 함수에 적용해 보면 어떨까요.

select Nvl( ltrim('abc','abc'),'IS NULL') from dual;
==> IS NULL

여러문자도 가능하군요..

그럼 아래의 쿼리는 

select Nvl( ltrim('abcbaaaabbbbccccaaabbbccc','abc'),'IS NULL') from dual;
==> IS NULL

baaaabbbbccccaaabbbccc 이 아닌 null이네요..

즉 ltrim,rtrim 의 trim set 은 여러 문자가 가능하고..
여러 문자인 경우는 각각의 하나의 문자가 해당되는경우 없애준다라는 의미입니다.
즉 위 예에서는 왼쪽이 a이거나 b이거나 c면 없앤다..
다시 왼쪽이 a이거나 b이거나 c면 없앤다..
왼쪽이 a이거나 b이거나 c면 없앤다..
이런 작용이 왼쪽 첫 문자가 a도 아니고 b도 아니고 c도 아닐때 까지 작용하는 것입니다.











테스트용 테이블 만들때 유용하게 쓸수 있죠..

CREATE TABLE TEST_MEMBER AS SELECT * FROM MEMBER

 

검색을 걸어서 필요한 데이타만 복사할수도 있죠.

CREATE TABLE TEST_MEMBER AS SELECT * FROM MEMBER WHERE IDX<10000

 

테이블 구조만 복사하고 싶다면..

CREATE TABLE TEST_MEMBER AS SELECT * FROM MEMBER WHERE 1=2

검색조건을 이렇게 한다면 테이타는 복사가 안되겠죠..

 

테이블이 이미 만들어진 경우는

INSERT INTO TEST_MEMBER SELECT * FROM MEMBER


주의할점은 테이블구조만 복사된다는 것이다.

프라이머리키나 인덱스등은 복사가 안돼니 따로 설정해 주어야 한다.

+ Recent posts