복붙노트

[SQL] 가장 좋은 방법은 "비어 있거나 null 값"을 확인합니다

SQL

가장 좋은 방법은 "비어 있거나 null 값"을 확인합니다

값이 null 또는 빈 문자열 포스트 그레스 SQL 문에 있는지 확인하는 가장 좋은 방법은 무엇입니까?

체크 한 번만 작성하는 것이 바람직하다 그래서 값은 긴 표현이 될 수 있습니다.

현재 내가 사용하고 있습니다 :

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

그러나 조금 추한 보인다.

stringexpression 숯불 (n)이 열 또는 문자 표현 (N)를 함유하는 후단 공백 열 수있다.

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

해결법

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

    1.발현 stringexpression = '수율 :

    발현 stringexpression = '수율 :

    TRUE위한 .. '(또는 데이터 타입 문자 만 공백으로 구성된 문자열에 대한 (N)) NULL .. NULL을위한 무엇을위한 .. FALSE

    "stringexpression이 NULL이거나 비어 있습니다"이처럼 확인합니다 :

    (stringexpression = '') IS NOT FALSE
    

    또는 역 접근 방식은 (쉽게 읽을 수 있습니다) :

    (stringexpression <> '') IS NOT TRUE
    

    좀처럼 유용 쓸모 CHAR (n)를 포함한 모든 문자 유형에 대한 작품. 이 매뉴얼에 대한 비교 연산자.

    또는 (아래 참조) 단지 CHAR (n)에 대한 쓸모가있을 것 트림 ()하지 않고, 당신이 이미 가지고 표현을 사용하거나 다른 문자 유형에 대한 테스트 만 공간으로 구성된 문자열을 포함 할 것입니다 :

    coalesce(stringexpression, '') = ''
    

    그러나 상단에있는 표현은 빠릅니다.

    반대 주장 : "stringexpression가 null와 하늘이 어느 쪽도 아닌"도 간단하다 :

    stringexpression <> ''
    

    모든 유용한 데이터 유형의 다른 문자 VARCHAR 같은 유형 (N), VARCHAR, 텍스트 또는 (따옴표) "문자",이 데이터 유형을 혼동하지 마십시오. 짧게, 문자 (N) : 문자 (N)이 매우 제한된 유용성과 오래된 데이터 타입에 관한 것이다. 또한, 문자와 문자는 문자 (1) / 문자 (1) (같은 것)의 약자입니다.

    CHAR (N)에서 (다른 문자열 유형과 달리!) 빈 문자열은 공백 만 구성된 다른 문자열에서 다르지 않다. 이러한 모든 유형의 정의에 따라 문자 (N)의 N 개의 공간으로 접혀있다. 그것은 논리적으로 다음 그뿐만 아니라 CHAR (n)의이 작품 :

    coalesce(stringexpression, '') = ''
    

    다만 이러한 많은 (어떤 다른 문자 유형없는 일 것)

    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;
    

    CHAR (N)와 "null 또는 빈 문자열"에 대한 시험 :

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

    텍스트 "null 또는 빈 문자열"에 대한 테스트

    SELECT stringexpression 
          ,stringexpression = ''                    AS simple_test
          ,(stringexpression = '')  IS NOT FALSE    AS test1
          ,(stringexpression <> '') IS NOT TRUE     AS test2
          ,coalesce(stringexpression, '') = ''      AS test_coalesce1
          ,coalesce(stringexpression, '  ') = '  '  AS test_coalesce2
          ,coalesce(stringexpression, '') = '  '    AS test_coalesce3
    FROM  (
       VALUES
         ('foo'::text)
       , ('')
       , (NULL)
       , ('   ')                -- different from '' in a sane character type like text
       ) sub(stringexpression);
    

    여기 dbfiddle 올드 SQL 바이올린

    관련 :

  2. ==============================

    2.널 (null) 및 비어를 확인하려면 :

    널 (null) 및 비어를 확인하려면 :

    coalesce(string, '') = ''
    

    널 (null)를 확인하려면 비우고 공간 (문자열을 트림)

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

    3.문자열도 작동하고 컴팩트의 길이에 대한 확인 :

    문자열도 작동하고 컴팩트의 길이에 대한 확인 :

    where length(stringexpression) > 0;
    
  4. ==============================

    4.빈 후행 공백이있을 수 있다면, 아마 더 나은 솔루션이있다. COALESCE는 당신 같은 문제입니다.

    빈 후행 공백이있을 수 있다면, 아마 더 나은 솔루션이있다. COALESCE는 당신 같은 문제입니다.

  5. ==============================

    5.I 톱 사람들이 사용하는 것이 뭔가 stringexpression> ''입니다. 이없는 가장 빠른 하나가 될 수 있지만, 가장 짧은 중 하나가 될 일이있다.

    I 톱 사람들이 사용하는 것이 뭔가 stringexpression> ''입니다. 이없는 가장 빠른 하나가 될 수 있지만, 가장 짧은 중 하나가 될 일이있다.

    MS SQL뿐 아니라 PostgreSQL을에 그것을 시도.

  6. ==============================

    6.널 (NULL) 필드를 비교하는 내 preffered 방법입니다 : NULLIF (nullablefield :가 parameterValue)이 NULL AND NULLIF IS (:가 parameterValue, nullablefield)는 NULL이다. 이것은 복잡하지만 합체는 어떤 경우에는 불가능하지만 보편적 인 사용이다.

    널 (NULL) 필드를 비교하는 내 preffered 방법입니다 : NULLIF (nullablefield :가 parameterValue)이 NULL AND NULLIF IS (:가 parameterValue, nullablefield)는 NULL이다. 이것은 복잡하지만 합체는 어떤 경우에는 불가능하지만 보편적 인 사용이다.

    "NULL이다 NULLIF (가 parameterValue nullablefield가)"첫 번째 파라미터가 NULL 인 경우 항상 "참"을 반환하므로 NULLIF 두번째 및 역 사용하는 것이다.

  7. ==============================

    7.데이터베이스 레코드의 수가 많은 경우는 null 검사 시간이 더 걸릴 수 있습니다 당신과 같은 다른 방법으로 확인 NULL을 사용할 수 있습니다 : 1) 여기서, 기둥 이름은 널 2)하지 존재하는 () 기둥 이름은 널 해당 단부 후 3) WHERE (케이스)

    데이터베이스 레코드의 수가 많은 경우는 null 검사 시간이 더 걸릴 수 있습니다 당신과 같은 다른 방법으로 확인 NULL을 사용할 수 있습니다 : 1) 여기서, 기둥 이름은 널 2)하지 존재하는 () 기둥 이름은 널 해당 단부 후 3) WHERE (케이스)

  8. ==============================

    8.또 다른 방법은

    또 다른 방법은

    nullif(trim(stringExpression),'') is not null
    
  9. ==============================

    9.답변의 많은 가장 짧은 방법이 아닌 반드시 열이 널 (null)이 많이있는 경우 가장 좋은 방법입니다. 검사를 깨고 옵티마이 빨리 다른 조건으로 일을 할 필요가 없기 때문에 검사를 평가할 수 있습니다.

    답변의 많은 가장 짧은 방법이 아닌 반드시 열이 널 (null)이 많이있는 경우 가장 좋은 방법입니다. 검사를 깨고 옵티마이 빨리 다른 조건으로 일을 할 필요가 없기 때문에 검사를 평가할 수 있습니다.

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

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

  10. from https://stackoverflow.com/questions/23766084/best-way-to-check-for-empty-or-null-value by cc-by-sa and MIT license