Лучший способ проверить " пустое или нулевое значение"

как лучше всего проверить, является ли значение null или пустой строкой в инструкциях Postgres sql?

значение может быть длинным выражением, поэтому предпочтительно, чтобы оно было написано только один раз.

В настоящее время я использую:

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

но это выглядит немного некрасиво.

stringexpression может быть char(n) столбец или выражение, содержащее char(n) столбцы с конечными пробелами.

что самый лучший путь?

6 ответов


выражение stringexpression = '' выходы:

TRUE .. для '' (или любой строка, состоящая только из пробелов с типом данных char(n))
NULL .. для NULL
FALSE .. для что-нибудь else

чтобы проверить: "stringexpression равно NULL или пусто":

(stringexpression = '') IS NOT FALSE

или обратный подход (может быть легче читать):

(stringexpression <> '') IS NOT TRUE

работает любой тип символов включая устаревшие char(n) что вряд ли когда-нибудь пригодятся.
руководство по операторам сравнения.

или используйте выражение, которое у вас уже было, только без trim() что было бы бесполезно для char(n)(см. ниже), или он будет включать строки, состоящие только из пробелов в тесте на другого персонажа типы:

coalesce(stringexpression, '') = ''

но выражения наверху быстрее.

твердят обратное: "stringexpression не является ни нулевым, ни пустым" еще проще:

stringexpression <> ''

о char(n)

не путайте этот тип данных с другими типами характеров, как varchar(n), varchar, text или "char" (с кавычками), которые являются полезными типами данных. Это про устаревший тип данных с очень ограниченной полезностью:char(n), сокращенное: character(n). Кроме того,char и character сокращенно char(1) / character(1) (то же самое).

на char(n) (в отличие от других типов string!) an пустая строка не отличается от любой другой строки, состоящей только из пробелов. Все они сложены в n помещения в char(n) на определение типа. Логически следует, что это работает для char(n) as хорошо:

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;
eq1 | eq2 | eq3
----+-----+----
t   | t   | t  

тест для "null или пустой строки" с char(n):

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);
 stringexpression | simple_test | test1 | test2 | test_coalesce1 | test_coalesce2 | test_coalesce3
------------------+-------------+-------+-------+----------------+----------------+----------------
 foo              | f           | f     | f     | f              | f              | f
                  | t           | t     | t     | t              | t              | t
                  |             | t     | t     | t              | t              | t
                  | t           | t     | t     | t              | t              | t

тест для "null или пустой строки" с text

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);
 stringexpression | simple_test | test1 | test2 | test_coalesce1 | test_coalesce2 | test_coalesce3
------------------+-------------+-------+-------+----------------+----------------+----------------
 foo              | f           | f     | f     | f              | f              | f
                  | t           | t     | t     | t              | f              | f
                  |             | t     | t     | t              | t              | f
                  | f           | f     | f     | f              | f              | f

dbfiddle здесь
старая скрипка SQL

по теме:


чтобы проверить значение null и empty:

coalesce(string, '') = ''

чтобы проверить наличие null, пустых и пробелов (обрезать строку)

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

Если могут быть пустые конечные пробелы, вероятно, нет лучшего решения. COALESCE просто для таких проблем, как ваши.


что-то, что я видел, люди используют это stringexpression > ''. Это может быть не самый быстрый, но один из самых коротких.

пробовал его на MS SQL, а также на PostgreSQL.


мой предложенный способ сравнить nullable поля: Функция nullif(nullablefield, :Значение_параметра) имеет значение null и функция nullif(:Значение_параметра, nullablefield) имеет значение null . Это громоздко, но имеет универсальное применение, в то время как объединение в некоторых случаях невозможно.

второе и обратное использование NULLIF связано с тем, что "NULLIF(nullablefield,: ParameterValue) равно NULL" всегда возвращает "true", если первый параметр равен null.


если база данных имеет большое количество записей, то null check может занять больше времени вы можете использовать null check по-разному, например : 1) where columnname is null 2) where not exists() 3) WHERE (case when columnname is null then true end)