Каков наилучший способ проверить, является ли значение пустым или пустым в выражениях Postgres SQL?
Значение может быть длинным выражением, поэтому предпочтительно, чтобы оно записывалось только один раз при проверке.
В настоящее время я использую:
coalesce( trim(stringexpression),'')=''
Но это выглядит немного некрасиво.
stringexpression
может быть char(n)
столбцом или выражением, содержащим char(n)
столбцы с завершающими пробелами.
Какой лучший способ?
char
почти всегда является неправильным выбором из-за заполнения (и в результате космического мусора). Но кроме этого: я не думаю, что есть лучшее решение.Ответы:
Выражение
stringexpression = ''
дает:TRUE
.. для''
(или для любой строки, состоящей только из пробелов с типом данныхchar(n)
)NULL
.. дляNULL
FALSE
.. для всего остальногоИтак, чтобы проверить: «
stringexpression
либо NULL, либо пусто» :Или обратный подход (может быть легче читать):
Работает для любого типа символов, в том числе
char(n)
. Руководство по сравнению операторов.Или используйте исходное выражение без
trim()
, что является дорогостоящим шумомchar(n)
(см. Ниже) или неверным для других типов символов: строки, состоящие только из пробелов, будут передаваться как пустые строки.Но выражения в верхней части быстрее.
Утверждать обратное еще проще: «не
stringexpression
является ни пустым, ни пустым» :Около
char(n)
Речь идет о типе данных
char(n)
, коротко для:character(n)
. (char
/character
сокращенно отchar(1)
/character(1)
.) Его использование не рекомендуется в Postgres :Не путать
char(n)
с типами другой, полезный характерvarchar(n)
,varchar
,text
или"char"
(с двойными кавычками).В
char(n)
качестве пустой строки не отличается от любой другой строки , состоящей только из пробелов. Все они складываются в n пробелов вchar(n)
соответствии с определением типа. Логично следует, что вышеприведенные выражения также работаютchar(n)
- так же, как и эти (что не будет работать для других типов символов):демонстрация
Пустая строка равна любой строке пробелов при приведении к
char(n)
:Результат:
Проверка на "нулевую или пустую строку" с
char(n)
:Результат:
Проверка на "нулевую или пустую строку" с
text
:Результат:
db <> скрипеть здесь
Old sqlfiddle
Связанный:
источник
best way to check if value is null or empty string
.trim()
Вызов (сравнительно) дорого - и просто не нужно. Я добавил еще и проchar(n)
"пустую строку".''
. Можно ли снять обшивку и использоватьcoalesce(stringexpression,'')=''
для проверки. Это выглядит более читабельным для меня по сравнению с вашим ответом.select coalesce(' ', '') = ''
возвращает ложь Таким образом, TRIM () требуетсяcoalesce(' '::char(5), '') = ''
нет. В любом случае я бы использовал одно из двух верхних выражений, которые работают для любого типа символов и являются самыми быстрыми и чистыми.Чтобы проверить на пустое и пустое:
Для проверки на нулевые, пустые и пробелы (обрезать строку)
источник
Проверка длины строки также работает и является компактной:
источник
where length(stringexpression) = 0;
. Это работает для меня.Если могут быть пустые конечные пробелы, возможно, нет лучшего решения.
COALESCE
только для таких проблем, как ваша.источник
То, что я видел, люди используют
stringexpression > ''
. Это может быть не самым быстрым, но бывает одним из самых коротких.Пробовал это на MS SQL, а также на PostgreSQL.
источник
другой способ
источник
Мой предпочтительный способ сравнения пустых полей: NULLIF (nullablefield,: ParameterValue) IS NULL И NULLIF (: ParameterValue, nullablefield) IS NULL. Это громоздко, но универсально, а в некоторых случаях объединить невозможно.
Второе и обратное использование NULLIF заключается в том, что «NULLIF (nullablefield,: ParameterValue) IS NULL» всегда будет возвращать «true», если первый параметр имеет значение null.
источник
Если база данных имеет большое количество записей, то это
null check
может занять больше времени, вы можете использовать нулевую проверку различными способами, такими как: 1)where columnname is null
2)where not exists()
3)WHERE (case when columnname is null then true end)
источник
Многие ответы - самый короткий, не обязательно лучший, если в столбце много нулей. Прерывание проверок позволяет оптимизатору оценивать проверку быстрее, поскольку ему не нужно выполнять работу с другим условием.
Сравнение строк не нужно оценивать, поскольку первое условие ложно.
источник