"빈 값 또는 null 값"을 확인하는 가장 좋은 방법


176

Postgres SQL 문에서 value가 null 또는 빈 문자열인지 확인하는 가장 좋은 방법은 무엇입니까?

값은 긴 표현식 일 수 있으므로 한 번에 한 번만 작성하는 것이 좋습니다.

현재 나는 다음을 사용하고 있습니다 :

coalesce( trim(stringexpression),'')=''

그러나 조금 추한 것 같습니다.

stringexpression다음을 char(n)포함하는 열 또는 표현식 일 수 있습니다.char(n)후행 공백이 열을 열 .

가장 좋은 방법은 무엇입니까?


3
char패딩 (및 결과로 발생하는 공간 낭비) 때문에 사용 은 거의 항상 잘못된 선택입니다. 그러나 그 외에도 : 더 나은 해결책이 없다고 생각합니다.
a_horse_with_no_name

왜 못 생겼어? 논리적이고 읽기 쉬운.
klin

1
@ a_horse_with_no_name : 나는 생각합니다.
Erwin Brandstetter

답변:


283

표현 stringexpression = ''은 다음과 같습니다.

TRUE   .. 대 ''(또는 대한 모든 데이터 유형과 공간에서만 이루어지는 문자열 char(n))
NULL   에 대한 ..NULL
FALSE 다른 용도 ..

확인하려면 : " stringexpressionis NULL or empty" :

(stringexpression = '') IS NOT FALSE

또는 그 반대의 접근 방식 (읽기가 더 쉬울 수 있음) :

(stringexpression <> '') IS NOT TRUE

를 포함한 모든 문자 유형에 적용char(n) 됩니다. 비교 연산자에 대한 매뉴얼.

또는을 사용하지 않고 원래 표현식을 사용하면 trim()비용이 많이 들거나 char(n)(아래 참조) 다른 문자 유형에는 올바르지 않습니다. 공백만으로 구성된 문자열은 빈 문자열로 전달됩니다.

coalesce(stringexpression, '') = ''

그러나 상단의 표현이 더 빠릅니다.

반대의 주장은 훨씬 간단합니다 : " stringexpressionis not null or empty" :

stringexpression <> ''

char(n)

이 데이터 유형에 관한 char(n)짧은 들어, : character(n). ( char/ character에 대한 짧은 char(1)/ character(1).)의 사용이다 포스트 그레스에 낙담 :

대부분의 상황에서 text 또는 character varying대신 사용해야합니다.

char(n)다른 유용한 문자 유형과 혼동하지 마십시오 varchar(n).varchar , text또는"char" (따옴표 포함).

에서 빈 문자열 공백 만 구성된 다른 문자열에서 다르지 않다. 이러한 유형은 유형 정의에 따라 n 개의 공백으로 접 힙니다 . 논리적으로 위의 표현식이 작동합니다.char(n)char(n)char(n) 은 다른 문자 유형에서는 작동하지 않는 과 마찬가지로 작동합니다.

coalesce(stringexpression, '  ') = '  '
coalesce(stringexpression, '') = '       '

데모

빈 문자열은 다음으로 캐스팅 할 때 공백 문자열과 같습니다 char(n).

SELECT ''::char(5) = ''::char(5)     AS eq1
     , ''::char(5) = '  '::char(5)   AS eq2
     , ''::char(5) = '    '::char(5) AS eq3;

결과:

 eq1 | eq2 | eq3
 ----+-----+----
 t   | t   | t

다음을 사용하여 "널 또는 빈 문자열"을 테스트하십시오 char(n).

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::char(5))
   , ('')
   , ('   ')                -- not different from '' in char(n)
   , (NULL)
   ) sub(stringexpression);

결과:

문자열 표현 | base_test | test1 | test2 | coalesce1 | coalesce2 | 합체 3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
 foo | f | f | f | f | f | 에프
                  | t | t | t | t | t | 티
                  | t | t | t | t | t | 티
 null              | null       | t | t | t | t | 티

다음을 사용하여 "널 또는 빈 문자열"을 테스트하십시오 text.

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::text)
   , ('')
   , ('   ')                -- different from '' in a sane character types
   , (NULL)
   ) sub(stringexpression);

결과:

문자열 표현 | base_test | test1 | test2 | coalesce1 | coalesce2 | 합체 3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
 foo | f | f | f | f | f | 에프
                  | t | t | t | t | f | 에프
                  | f | f | f | f | f | 에프
 null              | null       | t | t | t | t | 에프

db <> 바이올린 여기에
오래된 sqlfiddle

관련 :


2
@a_horse_with_no_name : OP가을 요청합니다 best way to check if value is null or empty string. trim()그냥 필요는 없습니다 - 전화는 (비교적) 비싸다. 나는 char(n)"빈 문자열" 에 대해 더 많이 추가했습니다 .
Erwin Brandstetter

1
공백 만 포함하는 모든 문자열 표현식은 같습니다 ''. 트림을 제거 coalesce(stringexpression,'')=''하고 확인 하는 데 사용할 수 있습니까? 이것은 귀하의 답변과 비교하여 나에게 더 읽기 쉽습니다.
Andrus

1
@Andrus : 그렇습니다. 나는 그에 대한 답변을 추가했습니다.
Erwin Brandstetter 14

3
select coalesce(' ', '') = '' false를 반환합니다. 따라서 TRIM ()이 필요합니다
Andrus

1
그러나 coalesce(' '::char(5), '') = ''그렇지 않습니다. 나는 어떤 경우에도 상위 2 개의 표현 중 하나를 사용합니다.이 표현은 모든 문자 유형에 작동하며 가장 빠르고 깨끗합니다.
Erwin Brandstetter

46

널과 비어 있는지 확인하려면 다음을 수행하십시오.

coalesce(string, '') = ''

널, 공백 및 공백을 확인하려면 (문자열 자르기)

coalesce(TRIM(string), '') = ''

3
나는이 대답의 단순성 / 명확성을 좋아합니다.
stwr667

12

문자열의 길이를 확인하는 것도 효과적이며 컴팩트합니다.

where length(stringexpression) > 0;

NULL 사례를 확인 했습니까?
Flinsch

1
그래, 내가 했어. 비어 있거나 null 문자열 필드는 반환하지 않습니다.
yglodt

빈 값만 확인 해야하는 경우이-> 시도하십시오 where length(stringexpression) = 0;. 이것은 나를 위해 작동합니다.
Kushan Gunasekera

2

후행 공백이 비어 있으면 더 나은 해결책이 없을 것입니다. COALESCE당신과 같은 문제에 대한 것입니다.


1

내가 사람들이 사용한 것을 보았습니다 stringexpression > ''. 이것은 가장 빠른 것이 아니지만 가장 짧은 것 중 하나입니다.

MS SQL과 PostgreSQL에서 시도했습니다.



0

nullable 필드를 비교하는 가장 좋은 방법은 다음과 같습니다. NULLIF (nullablefield, : ParameterValue) IS NULL 및 NULLIF (: ParameterValue, nullablefield) IS NULL입니다. 이것은 번거롭지 만 보편적으로 사용되는 반면 Coalesce는 불가능합니다.

NULLIF의 두 번째 및 반대로 사용은 첫 번째 매개 변수가 null 인 경우 "NULLIF (nullablefield, : ParameterValue) IS NULL"은 항상 "true"를 반환하기 때문입니다.


0

데이터베이스에 많은 수의 레코드가있는 경우 null check더 많은 시간이 소요될 수 있습니다. 다음 과 같은 방법으로 널 검사를 사용할 수 있습니다. 1) where columnname is null 2) where not exists() 3)WHERE (case when columnname is null then true end)


0

열에 널이 많은 경우 반드시 가장 좋은 방법은 아니지만 많은 대답이 가장 짧은 방법입니다. 점검을 중단하면 옵티마이 저가 다른 조건에서 작업 할 필요가 없으므로 점검을 더 빨리 평가할 수 있습니다.

(stringexpression IS NOT NULL AND trim(stringexpression) != '')

첫 번째 조건이 거짓이므로 문자열 비교를 평가할 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.