PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Най-добрият начин да проверите за празна или нулева стойност

Изразът stringexpression = '' добиви:

TRUE .. за '' (или за всякакви низ, състоящ се само от интервали с тип данни char(n) )
NULL .. за NULL
FALSE .. за всичко друго

Така че, за да проверите за:"stringexpression е NULL или празен" :

(stringexpression = '') IS NOT FALSE

Или обратният подход (може да е по-лесен за четене):

(stringexpression <> '') IS NOT TRUE

Работи за всеки тип знаци, включително char(n) . Ръководството за операторите за сравнение.

Или използвайте оригиналния си израз без trim() , което е скъпоструващ шум за char(n) (вижте по-долу) или неправилно за други типове знаци:низовете, състоящи се само от интервали, ще преминат като празен низ.

coalesce(stringexpression, '') = ''

Но изразите в горната част са по-бързи.

Потвърждаването на обратното е още по-просто:"stringexpression не е нито NULL, нито е празен“ :

stringexpression <> ''

Относно char(n)

Става въпрос за типа данни char(n) , съкратено от:character(n) . (char / character са съкратени от char(1) / character(1) .) Използването му не се препоръчва в Postgres:

В повечето ситуации text или character varying трябва да се използва вместо това.

Не бъркайте char(n) с други, полезни типове знаци varchar(n) , varchar , text или "char" (с двойни кавички).

В char(n) празен низ не се различава от всеки друг низ, състоящ се само от интервали. Всички те са сгънати до 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);

Резултат:

 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

Тествайте за "нулев или празен низ" с 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);

Резултат:

 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<>цигулка тук
Стар sqlfiddle

Свързано:

  • Някакви недостатъци при използването на тип данни „текст“ за съхранение на низове?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Пренасочване на вмъкване, базирано на задействане на Postgres, без прекъсване на RETURNING

  2. Отидете на заявка LIKE на postgresql

  3. Разгръщане и управление на PostgreSQL 11:Ново в ClusterControl 1.7.1

  4. Преобразувайте екранизирания символ на Unicode обратно в действителен знак в PostgreSQL

  5. Oracle еквивалент на Postgres' DISTINCT ON?