SQLite équivalent à ISNULL (), NVL (), IFNULL () ou COALESCE ()

92

Je voudrais éviter d'avoir de nombreuses vérifications comme les suivantes dans mon code:

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

J'ai pensé que je pourrais simplement demander à ma requête de prendre en charge les valeurs nulles en faisant quelque chose comme ceci:

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

J'utilise cependant SQLite et il ne semble pas reconnaître la isnullfonction. J'ai également essayé des équivalents reconnus dans d'autres bases de données ( NVL(), IFNULL()et COALESCE()), mais SQLite ne semble en reconnaître aucune.

Quelqu'un a-t-il des suggestions ou connaît-il une meilleure façon de le faire? Malheureusement, la base de données n'a pas de valeurs par défaut pour tous les champs. De plus, j'ai besoin d'utiliser certaines LEFT JOINclauses dans certains cas, où certains des champs retournés seront nuls car l'enregistrement correspondant dans la LEFT JOINtable n'existera pas.

Jason Down
la source

Réponses:

130

IFNULL, voir ici: http://www.sqlite.org/lang_corefunc.html#ifnull

pas de crochets autour de la fonction

SQLMenace
la source
Bah c'était les crochets. Merci pour ça. Cela me rendait fou que la documentation dise qu'il était pris en charge (y compris coalesce), mais cela ne fonctionnait pas. Un de ces jours ...
Jason Down
1
Je me rends compte que votre description de "pas de crochets autour de la fonction" fait référence à la question, mais avec une telle déclaration, il serait utile d'avoir un exemple sous votre déclaration initiale.
palswim
40

Essaye ça

ifnull(X,Y)  

par exemple

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

La ifnull()fonction renvoie une copie de son premier argument non NULL, ou NULL si les deux arguments sont NULL. Ifnull()doit avoir exactement 2 arguments. La ifnull()fonction équivaut à coalesce()avec deux arguments.

Hardik Darji
la source
1
Oui, j'ai compris que c'était que ifnullje voulais ... J'avais juste besoin de supprimer les crochets que j'utilisais.
Jason Down
@HardikDarji Parce que certains administrateurs satisfaits ont vu les mots "essayez ceci" et ne lisez pas plus loin. Ou, parce que quelqu'un a supposé à tort que votre comparaison de ifnull () à coalesce () est une erreur, comme ce serait le cas dans d'autres environnements db (mais pas dans sqlite). En tout cas, peu importe. Les réponses «Essayez ceci» sont meilleures que les réponses «lisez la documentation». Je vais parcourir les non-codes contenant des réponses / même pas les lire, à chaque fois. Merci d'avoir répondu!
maplemale
25

S'il n'y a pas de ISNULL()méthode, vous pouvez utiliser cette expression à la place:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Cela fonctionne de la même manière que ISNULL(fieldname, 0).

Mahdi Mohajer
la source
1
La fonction ifnullest l'équivalent SQLite de la isnullfonction sur laquelle la question se posait. À tous ceux qui liront ceci maintenant, veuillez consulter la réponse de SQLMenace (de plus d'un an et demi plus tôt néanmoins) avant d'écrire votre propre solution en utilisant CASE.
spaaarky21
1
@ spaaarky21 - Vous faites un bon point. Cependant, cette réponse est utile pour ceux qui utilisent potentiellement sqlite uniquement pour les tests unitaires et utilisent un autre SGBDR pour le code en direct. Dans ce cas, utiliser quelque chose comme des CASEinstructions pourrait avoir plus de sens que IFNULL.
Seth Flowers
2
@sethflowers Je peux voir la valeur de la mise en œuvre des valeurs par défaut nulles d'une manière plus neutre avec le SGBDR, mais c'est la réponse à une question différente. :) L'OP demande simplement l'équivalent de SQLite isnulldans d'autres systèmes et je ne voudrais pas encourager les gens à "rouler le leur".
spaaarky21
Je cherchais juste quelque chose comme ifnotnull () ou ifnonnull () pour compléter ifnull (), à utiliser dans la concaténation de chaînes dans la clause SELECT pour afficher "last_name, first_name" mais concaténer uniquement la virgule si first_name est non nul. Cette approche me permet de le faire.
steve_0804
3

Utilisation IS NULLou IS NOT NULLdans clause WHERE au lieu de la méthode ISNULL ():

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL
Thilo
la source
Veuillez modifier avec plus d'informations. Les réponses basées uniquement sur le code et «essayez ceci» sont déconseillées, car elles ne contiennent aucun contenu interrogeable et n'expliquent pas pourquoi quelqu'un devrait «essayer».
abarisone le
1
Cela n'a pas de rapport avec ce qui a été demandé. L'OP ne veut pas filtrer les lignes où myField1a une valeur non nulle, il veut remplacer la valeur dans la colonne de résultat par une autre, si la valeur de ligne est nulle.
Daniel Kamil Kozar
2

Pour l'équivalent de NVL () et ISNULL (), utilisez:

IFNULL(column, altValue)

column : La colonne que vous évaluez.

altValue : La valeur que vous souhaitez renvoyer si «colonne» est nulle.

Exemple:

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

* Remarque: la fonction COALESCE () fonctionne de la même manière que pour les autres bases de données.

Sources:

Lewdev
la source
-4

Vous pouvez facilement définir une telle fonction et l'utiliser ensuite:

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

ou même version minifiée:

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}
Stas Prihod'co
la source
4
Ce n'est pas SQLite.
Daniel Kamil Kozar