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?
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.
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
Les inconvénients
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!
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.
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