Що таке еквівалент PostgreSQL для ISNULL ()


254

У MS SQL-сервері я можу:

SELECT ISNULL(Field,'Empty') from Table

Але в PostgreSQL я отримую синтаксичну помилку. Як я імітую ISNULL()функціональність?


1
Ні, ви не можете цього зробити в MSSQL. Цей код не компілюється. ISNULLбере два аргументи і повертає другий, перший є null, інакше перший.
GSerg

@GSerg, ти маєш рацію. виправили це.
Байрон Вітлок

Gserg та Byron так, ви можете побачити тут Приклад з мого ПК SELECT isnull (a.FechaEntregada, '') як тест від dbo.Amonestacion a msdn.microsoft.com/en-us/library/ms184325.aspx
Juan

Відповіді:


452
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, тоді як coalesce використовує відповідні типи для кожного аргументу. Якщо ви просто шукаєте і замінюєте isnull coalesce, ви можете потенційно отримати багато помилок ...
Stefan Steiger

75

Використовуйте COALESCE()замість цього:

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

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

SELECT COALESCE(null, null, 5); 

повертає 5, поки

SELECT COALESCE(null, 2, 5);

повертає 2

Coalesce візьме велику кількість аргументів. Задокументованого максимуму немає. Я перевірив, що це 100 аргументів, і це вдалося. Цього має бути достатньо для переважної більшості ситуацій.


24

Як я імітую функціональність ISNULL ()?

SELECT (Field IS NULL) FROM ...

4
Це наслідує точну функціональність isnull, не впевнений, чому це знижено
smackshow

Найкраща відповідь на питання, звичайно. Цей вираз є повним еквівалентом ISNULL (). COALESCE () дуже розумний і цікавий, але він не може виконувати ISNULL (), поки він закритий.
Skrol29

16
Я не знаю, на що ISNULLви звертаєтесь до коментаторів, але field IS NULLдає булеве значення, тоді як ISNULLу SQL Server працює так COALESCE: він повертає одне з незначень NULL. Ця відповідь страшенно неправильна. Зверніться до документації: ISNULL.
jpmc26

10
Я підозрюю, що ці коментатори - користувачі MySQL, які не усвідомили, що питання починається з "У MS SQL Server, ..." MySQL має функцію ISNULL (), яка приймає один аргумент і повертає 0 або 1. Версія T-SQL приймає два аргументи і поводиться як COALESCE або NVL Oracle.
Девід Ноха

1
greatvovan, Незалежно від того, чи це був задум оригінального плаката, я вважаю, що люди хочуть - це відповідь на тему "Як я перевіряю, чи недійсне поле", не обов'язково "Як саме працює функція ISNULL". Так було зі мною, і ця відповідь ідеально підходить для цього.
Фріман Гельмут

15

Спробуйте:

SELECT COALESCE(NULLIF(field, ''), another_field) FROM table_name

3
Це добре, оскільки він охоплює випадок, коли текстове поле НЕ нульове, але також "порожнє".
soulia

-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 (), щоб ваша DBA не ненавиділа вас.
Йорданія

1
postgres, будь ласка, додайте isnull, щоб ніхто нікого не ненавидів.
Ерік Твілегар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.