Postgresql 의 trim 함수는 chr(9), chr(10), chr(13) 따위를 없애지 않는다.
Postgresql 의 trim 함수는 다른 프로그래밍 언어가 제공하는 trim 함수와는 달리 tab = chr(9), new line = chr(10) / chr(13) 는 없애지 않는다.
다른 데이타베이스가 제공하는 trim 함수도 마찬가지다(Oracle, MariaDB 등).
tab 이나 new line 까지 제거하기 위해서는 다음과 같이 처리해야 한다.
1. 해결방법
1.1. trim
select REGEXP_REPLACE(chr(10) || chr(9) || chr(13) || 'aaa' || chr(10) || chr(9) || chr(13), '^\s+|\s+$', '', 'g')
^
: 시작\s
: 공백+
: 1글자 이상|
: 혹은- $ : 끝
1.2. ltrim
select REGEXP_REPLACE(chr(10) || chr(9) || chr(13) || 'aaa' || chr(10) || chr(9) || chr(13), '^\s+', '')
1.3. rtrim
select REGEXP_REPLACE(chr(10) || chr(9) || chr(13) || 'aaa' || chr(10) || chr(9) || chr(13), '\s+$', '')
2. 실패 사례
다음의 sql 은 뒷부분 공백을 1개밖에 없애지 못한다.
select REGEXP_REPLACE(chr(10) || chr(9) || chr(13) || 'aaa' || chr(10) || chr(9) || chr(13), '^\s+(.*)\s+$', '\1')
결과는 'aaa' || chr(10) || chr(9)
이 된다.
3. 활용 사례
메모장에서 변경전 sql 은 다음과 같다.
title like '%' || ? || '%' or contents like '%' ? || '%'
위 sql 은 사용자가 복사해서 붙이는 등의 방식으로 검색어를 입력하는 과정에서 tab 등의 문자가 검색어의 앞뒤로 붙게 되는 경우에 다소간의 불편함이 있었다.
변경후 sql 은 다음과 같다.
title like '%' || REGEXP_REPLACE(?, '^\s+|\s+$', '', 'g') || '%' or contents like '%' || REGEXP_REPLACE(?, '^\s+|\s+$', '', 'g') || '%'
전체 소스코드는 memo.xml 을 참조한다.