Лучший способ проверить " пустое или нулевое значение"
как лучше всего проверить, является ли значение null или пустой строкой в инструкциях Postgres sql?
значение может быть длинным выражением, поэтому предпочтительно, чтобы оно было написано только один раз.
В настоящее время я использую:
coalesce( trim(stringexpression),'')=''
но это выглядит немного некрасиво.
stringexpression может быть char(n) столбец или выражение, содержащее char(n) столбцы с конечными пробелами.
что самый лучший путь?
6 ответов
выражение stringexpression = '' выходы:
TRUE .. для '' (или любой строка, состоящая только из пробелов с типом данных char(n))NULL .. для NULLFALSE .. для что-нибудь 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)