web-dev-qa-db-fra.com

Vérifier si une colonne n'est pas NULL

Je dois vérifier si une colonne n'est pas NULL dans mon instruction SQL. 

Ma requête SQL:

select column_a, column_b, column_c, column_d, column_x
from myTable

J'ai beaucoup de colonnes dans ma sélection. Donc, j'ai un problème de performance, si je voudrais faire ce qui suit:

select column_a, column_b, column_c, column_d, column_x
from myTable
where column_a is not null or column_b is not null or column_c is not null 
or column_x  is not null

Existe-t-il un autre (meilleur) moyen de vérifier s'il existe des colonnes qui ne sont PAS NULL?

16
bitsmuggler

Vous pouvez utiliser COALESCE pour cela. COALESCE renvoie la première valeur non nulle, le cas échéant. Cela ne fonctionnera probablement pas mieux, mais est beaucoup plus lisible.

Exemple:

where coalesce(column_a, column_b, column_c, column_x) is not null 

Selon la cardinalité de vos données, vous pourrez peut-être ajouter des index pour améliorer les performances.

Une autre possibilité consiste à utiliser une colonne calculée persistante qui vous indique si les quatre colonnes sont NULL ou non. 

24
RedFilter

Une façon d’attaquer ce problème pourrait consister à ajouter une colonne de bits supplémentaire permettant de déterminer s’il existe des valeurs ou non. 

Avantages

  • Peut être implémenté avec des déclencheurs afin que vous n'ayez pas besoin de changer le reste de votre code
  • Ne nécessite pas de scanner les autres colonnes
  • Cette colonne peut être indexée

Les inconvénients

  • Vos données seraient dé-normalisées
  • Plus compliqué/plus d'entretien
  • Plus d'espace de stockage pour la colonne supplémentaire

Si les avantages l'emportent sur les inconvénients, cela dépend de la quantité de performance que vous subissez en regardant les autres colonnes. Profilez-le avant de vous engager!

3
RQDQ

J'aime généralement la suggestion de COALESCE de @ RedFilter, mais une autre solution pourrait être d'utiliser la fonction CHECKSUM (). Bien entendu, la valeur de la somme de contrôle pour toutes les valeurs NULL dépend des colonnes et des types de données. Vous devez donc exécuter une requête pour obtenir cette valeur. Quelque chose comme:

select CHECKSUM(*) AS [All_NULL_Value]
from myTable
where column_a is null
AND column_b is null
AND column_c is null
AND column_d is null
AND column_x  is null

Ensuite, vous pouvez faire ceci:

select column_a, column_b, column_c, column_d, column_x
from myTable
where CHECKSUM(*) <> {All_NULL_Value_obtained_above}

Je ne sais pas si cela fonctionne mieux ou moins bien que l'idée de COALESCE, mais cela pourrait valoir la peine d'essayer.

2
Solomon Rutzky

Réponse acceptée il y a 5 ans, mais, comme l'a dit Brad, coalesce l'intitulé de la question est une mauvaise approche. Si dans certains cas vous avez vraiment besoin de vérifier ou si TOUS les paramètres sont nuls, vous pouvez utiliser ceci:

where convert(binary, column_a) + convert(binary, column_b) + convert(binary, column_c), + convert(binary, column_k) is null
0
Juozas