[SQL] PostgreSQL의 트림 후행 공백
SQLPostgreSQL의 트림 후행 공백
나는 후행 공백이 포함 된 열 EVENTDATE 있습니다. 내가 PostgreSQL의 기능 TRIM으로 제거하는 것을 시도하고있다 (). 보다 구체적으로, 나는 실행하고 있습니다 :
SELECT TRIM(both ' ' from eventDate)
FROM EventDates;
그러나, 후행 공백은 사라지지 않습니다. 나는 시도하고 (같은 숫자로) 날로부터 다른 문자를 트림 할 때 또한,이 중 하나를 잘라하지 않습니다. 내가 설명서를 읽고 있어요 경우 올바르게 작동합니다. 이견있는 사람?
해결법
-
==============================
1.많은 다른 보이지 않는 문자가 있습니다. 그들 중 많은 사람들이 유니 코드 속성 WSpace = Y ( "공백")를 가지고있다. 그러나 일부 특수 문자는 "공백"으로 간주하고 여전히 눈에 보이는 표현이없는 것은 아니다. 공간 (구두점)와 공백 문자가 당신에게 아이디어를 줄 것이다에 대한 우수한 위키 백과 기사.
많은 다른 보이지 않는 문자가 있습니다. 그들 중 많은 사람들이 유니 코드 속성 WSpace = Y ( "공백")를 가지고있다. 그러나 일부 특수 문자는 "공백"으로 간주하고 여전히 눈에 보이는 표현이없는 것은 아니다. 공간 (구두점)와 공백 문자가 당신에게 아이디어를 줄 것이다에 대한 우수한 위키 백과 기사.
<호언 장담> 유니 코드는이 점에서 짜증 :. 주로 혼동 사람들에게 봉사 이국적인 문자의 도입을 많이 호언 장담>
기본적으로 표준 SQL 트림 () 기능은 기본 라틴어 공백 문자를 트림 (유니 코드 : U + 0020 / ASCII 32). )합니다 (RTRIM () 및 LTRIM와 같은 변형. 귀하의 전화는 해당 특정 문자를 대상으로합니다.
REGEXP_REPLACE와 정규 표현식을 사용하여 () 대신.
(문자열 내부하지만 흰색없는 공간) 모든 후행 공백을 제거하려면 :
SELECT regexp_replace(eventdate, '\s+$', '') FROM eventdates;
정규 표현식 설명 : \는 .. [: 공간 :] []를위한 정규 표현 클래스 속기이야 - 공백 문자의 집합 인 - 아래의 제한 사항을 참조하십시오 + .. 1 이상 연속 경기 문자열의 .. 끝을 $
데모:
SELECT regexp_replace('inner white ', '\s+$', '') || '|'
보고:
inner white|
네, 하나의 백 슬래시 (\)입니다. 이 관련 대답 세부 사항.
(문자열 내부하지만 흰색없는 공간) 모든 주요 공백을 제거하려면 :
regexp_replace(eventdate, '^\s+', '')
문자열의 시작 ^ ..
모두를 제거하려면, 당신이 할 수있는 함수 호출 위의 체인 :
regexp_replace(regexp_replace(eventdate, '^\s+', ''), '\s+$', '')
또는 당신은 두 가지로 하나의 호출에 모두 결합 할 수 있습니다. 첫번째뿐만 아니라 모든 일치를 대체 할 4 매개 변수로 'g'를 추가 :
regexp_replace(eventdate, '^\s+|\s+$', '', 'g')
그러나 일반적으로) (하위 문자열로 빨리해야한다 :
substring(eventdate, '\S(?:.*\S)*')
\ S ... 모든하지만 공백 (: 재) 괄호의 세트는 비 - 포착 . * 0 ..-n 문자의 문자열
또는 이들 중 하나 :
substring(eventdate, '^\s*(.*\S)') substring(eventdate, '(\S.*\S)')
(재) .. 괄호 세트를 캡처
가능하면 효과적으로 마지막 공백이 아닌 문자로 공백이 아닌 첫 번째 문자와 모든 최대 소요됩니다.
유니 코드에서 "공백"으로 분류되는 몇 가지 더 관련 문자가 있습니다 - 그래서 문자 클래스에 포함되지는 [[: 공간 :]].
나를 위해 pgAdmin에 보이지 않는 상형 문자 등이 인쇄 : "몽골어 모음", "비 목공 폭 제로" "제로 폭 공간", "제로 폭 결합 자"
SELECT E'\u180e', E'\u200B', E'\u200C', E'\u200D'; '' | '' | '' | ''
"단어 소목", "제로 폭 비 깨는 공간": 브라우저에서 pgAdmin에 보이는 상형 문자로 인쇄보다 두,하지만 눈에 보이지 않는 :
SELECT E'\u2060', E'\uFEFF'; '' | ''
궁극적으로, 문자는 보이지 않는 렌더링 여부와 표시에 사용되는 글꼴에 따라 달라집니다.
교체뿐만 아니라,이 모두를 제거하려면 '\의'와 '[\의 \ u180e \ u200B \ u200C \ u200D \ U2060 \ uFEFF]'또는 '[\의 ]'(주 보이지 않는 문자를 후행!) . 예, 대신 :
regexp_replace(eventdate, '\s+$', '')
사용하다:
regexp_replace(eventdate, '[\s\u180e\u200B\u200C\u200D\u2060\uFEFF]+$', '')
또는:
regexp_replace(eventdate, '[\s]+$', '') -- note invisible characters
는 POSIX 문자 클래스도있다 [[: 그래프 :]] "눈에 보이는 문자를"표현하는데. 예:
substring(eventdate, '([[:graph:]].*[[:graph:]])')
그것은 모든 설정에서 ASCII 문자에 대해 안정적으로 작동합니다 (이 아래로 비등 [\ x21- \ x7E),하지만 당신은 현재 (포함. 페이지 10) 기본 OS에서 제공하는 정보에 의존 (CTYPE을 정의하는) 그 이상 가능성이 로케일 설정.
문자 클래스에 대한 모든 참조의 사건이, 말하기,하지만, 그래프와 같은 덜 일반적으로 사용되는 것들과 더 많은 의견 차이가있을 것 같다 엄밀히. 하지만 당신은 문자 클래스에 더 많은 문자를 추가 할 수 있습니다 [[: 공간 :]]을 (속기 \ s의) 모든 공백 문자를 잡을 수 있습니다. 마찬가지로 : \ u2007 \ u202f 및 \ u00a0 또한 @XiCoN JFS 누락 것으로 보인다.
수동 :
굵게 강조 광산.
또한 포스트 그레스 (10)이 고정 된 제한에 주목 :
-
==============================
2.그것은 당신이 그것을 처리하고있는 방식으로 작동해야하지만 특정 문자열을 모른 채 말을하기 어렵다.
그것은 당신이 그것을 처리하고있는 방식으로 작동해야하지만 특정 문자열을 모른 채 말을하기 어렵다.
당신은 단지 선행 공백을 트리밍하는 경우, 당신은보다 간결 양식을 사용 할 수 있습니다 :
SELECT RTRIM(eventDate) FROM EventDates;
이것은 작동을 보여 약간의 테스트입니다. 그것을 밖으로 작동하는지 알려주세요!
-
==============================
3.당신의 공백이 더 단지 공간 메타 값보다 경우에 당신은 REGEXP_REPLACE를 사용해야합니다보다 :
당신의 공백이 더 단지 공간 메타 값보다 경우에 당신은 REGEXP_REPLACE를 사용해야합니다보다 :
SELECT '(' || REGEXP_REPLACE(eventDate, E'[[:space:]]', '', 'g') || ')' FROM EventDates;
위의 예에서 내가의 반환 값을 경계하고있다 (과) 너무 쉽게 정규식 프롬프트 psql의에서 일하고 교체 할 것을 볼 수 있습니다. 그래서 당신은 당신의 코드에서이를 제거 할 수 있습니다.
-
==============================
4.
SELECT replace((' devo system ') ,' ','');
그것은 제공 : devosystem를
from https://stackoverflow.com/questions/22699535/trim-trailing-spaces-with-postgresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 4 액세스 표 속성을 가입 난간 (0) | 2020.07.22 |
---|---|
[SQL] SQL 쿼리 복잡성 대 성능에 어떤 일반적인 규칙이 있습니까? (0) | 2020.07.22 |
[SQL] 삽입 후 새로운 ID를 얻기 (0) | 2020.07.22 |
[SQL] 여러 값에 Where 절을 사용하여 SQL 문 (0) | 2020.07.22 |
[SQL] MySQL을 사용 소식 테이블에서 지난 6 개월을 선택하는 방법 (0) | 2020.07.22 |