Qual è l'equivalente PostgreSQL per ISNULL ()


255

In MS SQL-Server, posso fare:

SELECT ISNULL(Field,'Empty') from Table

Ma in PostgreSQL ottengo un errore di sintassi. Come posso emulare la ISNULL()funzionalità?


1
No, non puoi farlo in MSSQL. Quel codice non verrà compilato. ISNULLaccetta due argomenti e restituisce il secondo è il primo è null, altrimenti il ​​primo.
GSerg

@GSerg, hai ragione. risolto quello.
Byron Whitlock,

Gserg e Byron sì, si può vedere qui Esempio dal mio PC SELEZIONA IsNull (a.FechaEntregada, '') come prova dal dbo.Amonestacion un msdn.microsoft.com/en-us/library/ms184325.aspx
Juan

Risposte:


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

O più idiomatico:

SELECT coalesce(field, 'Empty') AS field_alias

49
+1 per coalesce. (PS Puoi farlo anche in MS SQL Server.)
Alison R.

2
Esistono altri casi per l'utilizzo di IS NULL, quindi è bene conoscerli entrambi.
Kyle Butt

30
Penso che valga la pena notare che coalesceè nello standard SQL, isnullessendo una funzione specifica per MS che essenzialmente ha coalescesolo due parametri.
GSerg

4
Coalesce () gestisce anche la promozione dei tipi correttamente (esattamente come fa UNION SELECT), mentre IsNull () no.
ErikE

2
Vale la pena sottolineare che ISNULL e COALESCE non sono gli stessi. IsNull impone il tipo di risultato al tipo di argomento1, mentre la coesione utilizza i rispettivi tipi per ciascun argomento. Se cerchi e sostituisci non è niente con la coalescenza, puoi potenzialmente ottenere molti errori ...
Stefan Steiger,

76

Usa COALESCE()invece:

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

Funziona in modo molto simile ISNULL, sebbene fornisca più funzionalità. Coalesce restituirà il primo valore non nullo nell'elenco. Così:

SELECT COALESCE(null, null, 5); 

restituisce 5, mentre

SELECT COALESCE(null, 2, 5);

restituisce 2

Coalesce prenderà un gran numero di argomenti. Non esiste un massimo documentato. Ho testato 100 argomenti e ci è riuscito. Questo dovrebbe essere sufficiente per la stragrande maggioranza delle situazioni.


24

Come posso emulare la funzionalità ISNULL ()?

SELECT (Field IS NULL) FROM ...

4
Questo emula l'esatta funzionalità di isnull, non sono sicuro del motivo per cui è stato
sottoposto a downgrade

La migliore risposta alla domanda, ovviamente. Questa espressione è l'equivalente completo di ISNULL (). COALESCE () è molto intelligente e interessante da sapere ma non può eseguire un ISNULL () mentre è chiuso.
Skrol29,

17
Non so a cosa ISNULLvi riferiate i vostri commentatori, ma field IS NULLdà un valore booleano, mentre ISNULLin SQL Server funziona come COALESCE: restituisce uno dei non NULLvalori. Questa risposta è terribilmente sbagliata. Vedere la documentazione: ISNULL.
jpmc26,

10
Sospetto che questi commentatori siano utenti MySQL che non hanno capito che la domanda inizia con "In MS SQL Server, ..." MySQL ha una funzione ISNULL () che accetta un singolo argomento e restituisce 0 o 1. La versione di T-SQL accetta due argomenti e si comporta come COALESCE o Oracle NVL.
David Noha,

1
greatvovan, Che questo fosse l'intento del poster originale, credo che ciò che la gente desidera sia la risposta a "Come posso verificare se un campo è nullo", non necessariamente "Come funziona esattamente la funzione ISNULL". Questo è stato il mio caso e questa risposta è perfetta per questo.
Freeman Helmuth

15

Provare:

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

3
Questo è utile in quanto copre il caso in cui un campo di testo NON è nullo, ma anche "vuoto".
soulia,

-9

Creare la seguente funzione

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'

E funzionerà.

È possibile creare versioni diverse con tipi di parametri diversi.


28
Per favore, nessuno lo fa. Usa invece coalesce () in modo che il tuo DBA non ti odi.
Giordania,

1
Postgres, per favore, aggiungi isnull così nessuno odia nessuno.
Eric Twilegar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.