Лучший способ проверить " пустое или нулевое значение"
как лучше всего проверить, является ли значение 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)