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.

Réponses:


130

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

pas de crochets autour de la fonction


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.


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).


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

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:


-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);}

4
Ce n'est pas SQLite.
Daniel Kamil Kozar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.