복붙노트

[SQL] PostgreSQL의 트림 후행 공백

SQL

PostgreSQL의 트림 후행 공백

나는 후행 공백이 포함 된 열 EVENTDATE 있습니다. 내가 PostgreSQL의 기능 TRIM으로 제거하는 것을 시도하고있다 (). 보다 구체적으로, 나는 실행하고 있습니다 :

SELECT TRIM(both ' ' from eventDate) 
FROM EventDates;

그러나, 후행 공백은 사라지지 않습니다. 나는 시도하고 (같은 숫자로) 날로부터 다른 문자를 트림 할 때 또한,이 중 하나를 잘라하지 않습니다. 내가 설명서를 읽고 있어요 경우 올바르게 작동합니다. 이견있는 사람?

해결법

  1. ==============================

    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. ==============================

    2.그것은 당신이 그것을 처리하고있는 방식으로 작동해야하지만 특정 문자열을 모른 채 말을하기 어렵다.

    그것은 당신이 그것을 처리하고있는 방식으로 작동해야하지만 특정 문자열을 모른 채 말을하기 어렵다.

    당신은 단지 선행 공백을 트리밍하는 경우, 당신은보다 간결 양식을 사용 할 수 있습니다 :

    SELECT RTRIM(eventDate) 
    FROM EventDates;
    

    이것은 작동을 보여 약간의 테스트입니다. 그것을 밖으로 작동하는지 알려주세요!

  3. ==============================

    3.당신의 공백이 더 단지 공간 메타 값보다 경우에 당신은 REGEXP_REPLACE를 사용해야합니다보다 :

    당신의 공백이 더 단지 공간 메타 값보다 경우에 당신은 REGEXP_REPLACE를 사용해야합니다보다 :

     SELECT '(' || REGEXP_REPLACE(eventDate, E'[[:space:]]', '', 'g') || ')' 
     FROM EventDates;
    

    위의 예에서 내가의 반환 값을 경계하고있다 (과) 너무 쉽게 정규식 프롬프트 psql의에서 일하고 교체 할 것을 볼 수 있습니다. 그래서 당신은 당신의 코드에서이를 제거 할 수 있습니다.

  4. ==============================

    4.

    SELECT  replace(('       devo    system      ') ,' ','');
    

    그것은 제공 : devosystem를

  5. from https://stackoverflow.com/questions/22699535/trim-trailing-spaces-with-postgresql by cc-by-sa and MIT license