Что такое эквивалент PostgreSQL для ISNULL ()

255

В MS SQL-Server я могу сделать:

SELECT ISNULL(Field,'Empty') from Table

Но в PostgreSQL я получаю синтаксическую ошибку. Как мне эмулировать ISNULL()функциональность?

Байрон Уитлок
источник
1
Нет, вы не можете сделать это в MSSQL. Этот код не будет компилироваться. ISNULLпринимает два аргумента и возвращает второй - первый null, иначе первый.
GSerg
@ Серг, ты прав. исправил это.
Байрон Уитлок
Gserg и Байрон да вы можете увидеть здесь пример из моего PC SELECT , ISNULL (a.FechaEntregada, «») в качестве теста из dbo.Amonestacion в msdn.microsoft.com/en-us/library/ms184325.aspx
Хуан

Ответы:

453
SELECT CASE WHEN field IS NULL THEN 'Empty' ELSE field END AS field_alias

Или более идиоматический:

SELECT coalesce(field, 'Empty') AS field_alias
Кайл Батт
источник
49
+1 за coalesce. (PS Вы можете сделать это и в MS SQL Server.)
Элисон Р.
2
Есть и другие случаи использования IS NULL, поэтому полезно знать и то, и другое.
Кайл Батт
30
Я думаю, что стоит отметить, что это coalesceстандарт SQL, isnullпоскольку он является специфичной для MS функцией, которая, по сути, имеет coalesceтолько два параметра.
GSerg
4
Coalesce () также правильно обрабатывает продвижение типов (точно так же, как UNION SELECT), а IsNull () - нет.
ErikE
2
Стоит отметить, что ISNULL и COALESCE - это не одно и то же. IsNull принудительно устанавливает тип результата в тип аргумента1, в то время как объединение использует соответствующие типы для каждого аргумента. Если вы просто ищите и заменяете isnull на coalesce, вы можете получить много ошибок ...
Stefan Steiger
76

Используйте COALESCE()вместо этого:

SELECT COALESCE(Field,'Empty') from Table;

Он функционирует очень похоже ISNULL, хотя и предоставляет больше функциональности. Coalesce вернет первое ненулевое значение в списке. Таким образом:

SELECT COALESCE(null, null, 5); 

возвращает 5, а

SELECT COALESCE(null, 2, 5);

возвращает 2

Коалесци примет большое количество аргументов. Документированного максимума нет. Я проверил это будет 100 аргументов, и это удалось. Этого должно быть достаточно для подавляющего большинства ситуаций.

Джим Клаус
источник
24

Как эмулировать функциональность ISNULL ()?

SELECT (Field IS NULL) FROM ...
Артур
источник
4
Это подражает точной функциональности isnull, но не уверен, почему за него проголосовали
smackshow
Лучший ответ на вопрос, конечно. Это выражение является полным эквивалентом ISNULL (). COALESCE () очень умный и интересный для понимания, но он не может выполнить ISNULL (), пока он закрыт.
Skrol29
17
Я не знаю, на что ISNULLссылаются ваши комментаторы, но field IS NULLдает логическое значение, а ISNULLв SQL Server работает так COALESCE: возвращает одно из ненулевых NULLзначений. Этот ответ ужасно неправильный. Обратитесь к документации: ISNULL.
jpmc26
10
Я подозреваю, что эти комментаторы являются пользователями MySQL, которые не понимали, что вопрос начинается с: «В MS SQL Server ...» MySQL имеет функцию ISNULL (), которая принимает один аргумент и возвращает 0 или 1. Версия T-SQL принимает два аргумента и ведут себя как COALESCE или Oracle NVL.
Давид Ноха
1
greatvovan, Было ли это намерением оригинального плаката, я думаю, что люди хотят получить ответ «Как проверить, является ли поле пустым», а не обязательно «Как именно работает функция ISNULL». Это было со мной, и этот ответ идеально подходит для этого.
Фримен Хельмут
15

Пытаться:

SELECT COALESCE(NULLIF(field, ''), another_field) FROM table_name
user2718914
источник
3
Это хорошо, так как охватывает случай, когда текстовое поле НЕ пустое, но также «пустое».
Соулия
-9

Создайте следующую функцию

CREATE OR REPLACE FUNCTION isnull(text, text) RETURNS text AS 'SELECT (CASE (SELECT $1 "
    "is null) WHEN true THEN $2 ELSE $1 END) AS RESULT' LANGUAGE 'sql'

И это сработает.

Вы можете создавать разные версии с разными типами параметров.


источник
28
Пожалуйста, никто не делает этого. Вместо этого используйте coalesce (), чтобы ваш администратор БД не ненавидел вас.
Джордан
1
postgres, пожалуйста, добавьте isnull, чтобы никто никого не ненавидел.
Эрик Твилегар