SQLite equivalente a ISNULL (), NVL (), IFNULL () o COALESCE ()


92

Vorrei evitare di avere molti controlli come i seguenti nel mio codice:

myObj.someStringField = rdr.IsDBNull(someOrdinal) 
                            ? string.Empty 
                            : rdr.GetString(someOrdinal);

Ho pensato che potevo semplicemente fare in modo che la mia query si occupasse dei null facendo qualcosa del genere:

SELECT myField1, [isnull](myField1, '') 
FROM myTable1
WHERE myField1 = someCondition

Tuttavia sto usando SQLite e non sembra riconoscere la isnullfunzione. Ho anche provato alcuni tra quelli equivalenti riconosciute in altre banche dati ( NVL(), IFNULL()e COALESCE()), ma SQLite non sembra riconoscere nessuno di loro.

Qualcuno ha qualche suggerimento o conosce un modo migliore per farlo. Purtroppo il database non ha valori predefiniti per tutti i campi. Inoltre, ho bisogno di utilizzare alcune LEFT JOINclausole in alcuni casi, in cui alcuni dei campi restituiti saranno nulli perché il record corrispondente nella LEFT JOINtabella non esisterà.

Risposte:


130

IFNULL, vedi qui: http://www.sqlite.org/lang_corefunc.html#ifnull

nessuna parentesi attorno alla funzione


Bah, erano le parentesi quadre. Grazie per quello. Mi stava facendo impazzire il fatto che la documentazione dicesse che era supportata (contiene anche una fusione), ma non funzionava. Uno di quei giorni ...
Jason Down,

1
Mi rendo conto che la tua descrizione di "nessuna parentesi attorno alla funzione" fa riferimento alla domanda, ma con un'affermazione del genere, sarebbe utile avere un esempio sotto la tua dichiarazione iniziale.
palswim

40

Prova questo

ifnull(X,Y)  

per esempio

select ifnull(InfoDetail,'') InfoDetail; -- this will replace null with ''
select ifnull(NULL,'THIS IS NULL');-- More clearly....

La ifnull()funzione restituisce una copia del suo primo argomento non NULL, o NULL se entrambi gli argomenti sono NULL. Ifnull()deve avere esattamente 2 argomenti. La ifnull()funzione è equivalente a coalesce()con due argomenti.


1
Sì, ho capito che ifnullvolevo ... avevo solo bisogno di eliminare le parentesi quadre che stavo usando.
Jason Down

@HardikDarji Perché alcuni amministratori negativi hanno visto le parole "prova questo" e non hanno letto oltre. Oppure, perché qualcuno ha erroneamente presunto che il confronto tra ifnull () e coalesce () sia errato, come sarebbe in altri ambienti db (ma non in sqlite). In ogni caso, chi se ne frega. Le risposte "Prova questo" sono migliori delle risposte "leggi la documentazione". Scorrerò le risposte che non contengono codice / non le leggerò nemmeno, ogni volta. Grazie per la risposta!
maplemale

25

Se non c'è un ISNULL()metodo, puoi usare questa espressione invece:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Funziona allo stesso modo di ISNULL(fieldname, 0).


1
La funzione ifnullè l'equivalente SQLite della isnullfunzione su cui si stava ponendo la domanda. Per chiunque stia leggendo questo ora, vedere la risposta di SQLMenace (da oltre un anno e mezzo prima) prima di scrivere la propria soluzione utilizzando CASE.
spaaarky21

1
@ spaaarky21 - Hai un buon punto. Tuttavia, questa risposta è utile per coloro che potenzialmente utilizzano sqlite solo per i test di unità e utilizzano un RDBMS diverso per il codice live. In tal caso, usare qualcosa di simile a CASEdichiarazioni potrebbe avere più senso di IFNULL.
Seth Flowers

2
@sethflowers posso vedere il valore nell'implementazione di valori predefiniti nulli in un modo più neutro per RDBMS, ma questa è la risposta a una domanda diversa. :) L'OP sta semplicemente chiedendo l'equivalente di SQLite isnullin altri sistemi e non vorrei incoraggiare le persone a "eseguire il proprio".
spaaarky21

Stavo solo cercando qualcosa come ifnotnull () o ifnonnull () per completare ifnull (), da utilizzare nella concatenazione di stringhe all'interno della clausola SELECT per visualizzare "last_name, first_name" ma concatenare solo la virgola se first_name non è null. Questo approccio mi ha permesso di farlo.
steve_0804

3

Usa IS NULLo IS NOT NULLnella clausola WHERE invece del metodo ISNULL ():

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

Si prega di modificare con ulteriori informazioni. Le risposte solo codice e "prova questo" sono sconsigliate, perché non contengono contenuti ricercabili e non spiegano perché qualcuno dovrebbe "provare questo".
abarisone

1
Non è rilevante per ciò che è stato chiesto. L'OP non vuole filtrare le righe in cui myField1ha un valore non nullo, vuole sostituire il valore nella colonna dei risultati con uno diverso, se il valore della riga è nullo.
Daniel Kamil Kozar

2

Per l'equivalente di NVL () e ISNULL () utilizzare:

IFNULL(column, altValue)

column : La colonna che stai valutando.

altValue : Il valore che vuoi restituire se "colonna" è nullo.

Esempio:

SELECT IFNULL(middle_name, 'N/A') FROM person;

* Nota: la funzione COALESCE () funziona come per gli altri database.

Fonti:


-4

Puoi facilmente definire tale funzione e usarla quindi:

ifnull <- function(x,y) {
  if(is.na(x)==TRUE) 
    return (y)
  else 
    return (x);
}

o la stessa versione minimizzata:

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}

4
Non è SQLite.
Daniel Kamil Kozar
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.