Quel est l'équivalent PostgreSQL pour ISNULL ()

255

Dans MS SQL-Server, je peux faire:

SELECT ISNULL(Field,'Empty') from Table

Mais dans PostgreSQL, j'obtiens une erreur de syntaxe. Comment émuler la ISNULL()fonctionnalité?

Byron Whitlock
la source
1
Non, vous ne pouvez pas faire cela dans MSSQL. Ce code ne sera pas compilé. ISNULLprend deux arguments et renvoie le second est le premier est null, sinon le premier.
GSerg
@GSerg, vous avez raison. corrigé cela.
Byron Whitlock
Gserg et Byron oui, vous pouvez voir ici Exemple de mon PC SELECT isnull (a.FechaEntregada, '') comme test de dbo.Amonestacion a msdn.microsoft.com/en-us/library/ms184325.aspx
Juan

Réponses:

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

Ou plus idiomatique:

SELECT coalesce(field, 'Empty') AS field_alias
Kyle Butt
la source
49
+1 pour coalesce. (PS Vous pouvez aussi le faire dans MS SQL Server.)
Alison R.
2
Il existe cependant d'autres cas d'utilisation de IS NULL, il est donc bon de connaître les deux.
Kyle Butt
30
Je pense qu'il vaut la peine de noter que c'est coalesceen standard SQL, avec isnullune fonction spécifique à MS qui est essentiellement coalesceavec seulement deux paramètres.
GSerg
4
Coalesce () gère également la promotion de type correctement (exactement comme le fait UNION SELECT), contrairement à IsNull ().
ErikE
2
Il convient de souligner qu'ISNULL et COALESCE ne sont pas identiques. IsNull force le type de résultat au type d'argument1, tandis que la fusion utilise les types respectifs pour chaque argument. Si vous recherchez et remplacez simplement isnull avec coalesce, vous pouvez potentiellement obtenir beaucoup d'erreurs ...
Stefan Steiger
76

Utilisez COALESCE()plutôt:

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

Il fonctionne de la même manière ISNULL, mais offre plus de fonctionnalités. Coalesce renverra la première valeur non nulle de la liste. Donc:

SELECT COALESCE(null, null, 5); 

renvoie 5, tandis que

SELECT COALESCE(null, 2, 5);

renvoie 2

Coalesce prendra un grand nombre d'arguments. Il n'y a pas de maximum documenté. J'ai testé ça va 100 arguments et ça a réussi. Cela devrait être suffisant pour la grande majorité des situations.

Jim Clouse
la source
24

Comment émuler la fonctionnalité ISNULL ()?

SELECT (Field IS NULL) FROM ...
Artur
la source
4
Cela émule la fonctionnalité exacte de isnull, je ne sais pas pourquoi il est sous
évalué
La meilleure réponse à la question, bien sûr. Cette expression est l'équivalent complet de ISNULL (). COALESCE () est très intelligent et intéressant à connaître, mais il ne peut pas exécuter un ISNULL () tant qu'il est fermé.
Skrol29
17
Je ne sais pas à quoi ISNULLvous faites référence, mais field IS NULLdonne une valeur booléenne, tandis que ISNULLdans SQL Server fonctionne comme COALESCE: il renvoie l'une des non- NULLvaleurs. Cette réponse est terriblement fausse. Consultez la documentation: ISNULL.
jpmc26
10
Je soupçonne que ces commentateurs sont des utilisateurs de MySQL qui n'ont pas réalisé que la question commence par, "Dans MS SQL Server, ..." MySQL a une fonction ISNULL () qui prend un seul argument et renvoie 0 ou 1. La version de T-SQL prend deux arguments et se comporte comme COALESCE ou NVL d'Oracle.
David Noha
1
greatvovan, Que ce soit ou non l'intention de l'affiche originale, je crois que ce que les gens veulent, c'est la réponse à "Comment puis-je vérifier si un champ est nul", pas nécessairement "Comment fonctionne exactement la fonction ISNULL". C'était le cas avec moi et cette réponse est parfaite pour ça.
Freeman Helmuth
15

Essayer:

SELECT COALESCE(NULLIF(field, ''), another_field) FROM table_name
user2718914
la source
3
C'est bien car cela couvre le cas où un champ de texte n'est PAS nul, mais aussi «vide».
soulia
-9

Créez la fonction suivante

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'

Et ça marchera.

Vous pouvez créer différentes versions avec différents types de paramètres.


la source
28
S'il vous plaît, personne ne fait ça. Utilisez plutôt coalesce () pour que votre DBA ne vous déteste pas.
Jordan
1
postgres veuillez ajouter isnull pour que personne ne déteste personne.
Eric Twilegar