PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Najlepszy sposób na sprawdzenie pustej lub zerowej wartości

Wyrażenie stringexpression = '' plony:

TRUE .. dla '' (lub dla dowolnego ciąg składający się tylko ze spacji o typie danych char(n) )
NULL .. dla NULL
FALSE .. na cokolwiek innego

Aby sprawdzić:"stringexpression ma wartość NULL lub jest pusta” :

(stringexpression = '') IS NOT FALSE

Lub odwrotne podejście (może być łatwiejsze do odczytania):

(stringexpression <> '') IS NOT TRUE

Działa dla każdego typu znaku, w tym char(n) . Podręcznik dotyczący operatorów porównania.

Lub użyj oryginalnego wyrażenia bez trim() , co jest kosztownym szumem dla char(n) (patrz poniżej) lub niepoprawne dla innych typów znaków:ciągi składające się tylko ze spacji będą przekazywane jako ciąg pusty.

coalesce(stringexpression, '') = ''

Ale wyrażenia na górze są szybsze.

Stwierdzenie czegoś przeciwnego jest jeszcze prostsze:"stringexpression nie jest ani NULL, ani pusty” :

stringexpression <> ''

O char(n)

Chodzi o typ danych char(n) , skrót od:character(n) . (char / char są skrótami od char(1) / character(1) .) Odradza się jego używanie w Postgresie:

W większości sytuacji text lub character varying powinno być używane zamiast tego.

Nie myl char(n) z innymi, użytecznymi typami znaków varchar(n) , varchar , text lub "char" (z podwójnymi cudzysłowami).

W char(n) pusty ciąg nie różni się od innych napisów składających się tylko ze spacji. Wszystkie są złożone do n spacje w char(n) zgodnie z definicją typu. Wynika z tego logicznie, że powyższe wyrażenia działają dla char(n) jak również - tak samo jak te (które nie działają dla innych typów postaci):

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

Demo

Pusty ciąg równa się dowolnemu ciągowi spacji podczas rzutowania na char(n) :

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

Wynik:

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

Przetestuj pod kątem „pustego lub zerowego ciągu” za pomocą 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);

Wynik:

 stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3 
------------------+-----------+-------+-------+-----------+-----------+-----------
 foo              | f         | f     | f     | f         | f         | f
                  | t         | t     | t     | t         | t         | t
                  | t         | t     | t     | t         | t         | t
 null             | null      | t     | t     | t         | t         | t

Przetestuj „pusty lub zerowy ciąg” za pomocą 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);

Wynik:

 stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3 
------------------+-----------+-------+-------+-----------+-----------+-----------
 foo              | f         | f     | f     | f         | f         | f
                  | t         | t     | t     | t         | f         | f
                  | f         | f     | f     | f         | f         | f
 null             | null      | t     | t     | t         | t         | f

db<>graj tutaj
Stary sqlfiddle

Powiązane:

  • Jakieś wady używania typu danych „tekst” do przechowywania ciągów?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Posortować według kolumny ASC, ale najpierw wartości NULL?

  2. Dlaczego powinieneś uczyć się PostgreSQL?

  3. Jak mogę uniemożliwić Postgresowi wstawianie podzapytania?

  4. Błąd migracji Django:kolumna nie istnieje

  5. Dodaj kolumnę sygnatury czasowej z domyślną funkcją NOW() tylko dla nowych wierszy