2009-04-28 12 views
67

vorrei evitare di avere molti controlli, come il seguente nel mio codice:SQLite equivalente a ISNULL(), NVL(), IFNULL() o COALESCE()

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

ho pensato che avrei potuto semplicemente la mia domanda prendersi cura dei valori nulli facendo qualcosa di simile a questo:

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

sto usando SQLite e anche se non sembra riconoscere la funzione isnull. Ho anche provato alcuni equivalenti riconosciuti in altri database (NVL(), IFNULL() e COALESCE()), ma SQLite non sembra riconoscerne nessuno.

Qualcuno ha qualche suggerimento o sa di un modo migliore per farlo. Sfortunatamente il database non ha valori predefiniti per tutti i campi. In più, ho bisogno di usare alcune clausole LEFT JOIN in alcuni casi, dove alcuni dei campi restituiti saranno nulli perché il record corrispondente nella tabella LEFT JOIN non esiste.

risposta

96

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

senza parentesi intorno alla funzione

+0

Bah erano le parentesi quadre. Grazie per quello. Mi faceva impazzire il fatto che la documentazione dicesse che era supportata (anche lì si è coalizzata), ma non funzionava. Uno di quei giorni ... –

18

Se non c'è ISNULL() metodo, è possibile utilizzare questa espressione, invece:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END 

Questo funziona allo stesso come ISNULL(fieldname, 0).

+1

La funzione 'ifnull' è l'equivalente SQLite della funzione' isnull' a cui la domanda stava chiedendo. Per chiunque stia leggendo questo, per favore vedi la risposta di SQLMenace (da oltre un anno e mezzo prima) comunque prima di scrivere la tua soluzione usando 'CASE'. – spaaarky21

+0

@ spaaarky21 - Fai un buon punto. Tuttavia, questa risposta è utile per coloro che utilizzano potenzialmente sqlite solo per il test delle unità e per utilizzare un RDBMS diverso per il codice live. In tal caso, l'uso di qualcosa come le istruzioni 'CASE' potrebbe avere più senso di' IFNULL'. –

+1

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

30

Prova questa

ifnull(X,Y) 

es

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

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

+0

Sì, ho capito che era "se nulla" volevo ... Avevo solo bisogno di lasciare le parentesi quadre che stavo usando. –

+1

Perché la mia risposta è stata votata? –

+0

@HardikDarji Perché un buon amministratore di downvote ha visto le parole "prova questo" e non leggi oltre. Oppure, perché qualcuno ha erroneamente ipotizzato che il tuo confronto tra ifnull() e coalesce() sia errato, come sarebbe in altri ambienti db (ma non in sqlite). In ogni caso, a chi importa. "Prova questo" le risposte sono meglio di "leggi la documentazione" risposte. Scorrerò senza codice le risposte contenenti/non le leggerò mai, ogni volta. Grazie per la risposta! – maplemale

-2

Si può facilmente definire tale funzione e usarlo poi:

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

o stessa versione minified:

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

Questo non è SQLite. –

2

Usa IS NULL o IS NOT NULL in WHERE clausola invece di ISNULL() metodo:

SELECT myField1 
FROM myTable1 
WHERE myField1 IS NOT NULL 
+0

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

+0

Questo non è rilevante per ciò che è stato chiesto. L'OP non vuole filtrare le righe in cui 'myField1' ha un valore non nullo, vuole sostituire il valore nella colonna del risultato con uno diverso, se il valore della riga è nullo. –

Problemi correlati