3 votes

Colonne NULLABLE de SQL Server vs fonction COUNT() de SQL

Quelqu'un peut-il m'aider à comprendre quelque chose ? Lorsque je le peux, j'évite généralement les (*) dans une instruction SQL. Aujourd'hui, c'est la revanche. Voici un scénario :

CREATE TABLE Tbl (Id INT IDENTITY(1, 1) PRIMARY KEY, Name NVARCHAR(16))

INSERT INTO Tbl VALUES (N'John')
INSERT INTO Tbl VALUES (N'Brett')
INSERT INTO Tbl VALUES (NULL)

Je pourrais compter le nombre d'enregistrements où Name es NULL comme suit :

SELECT COUNT(*) FROM Tbl WHERE Name IS NULL

Tout en évitant le (*), j'ai découvert que les deux déclarations suivantes me donnaient deux résultats différents :

SELECT COUNT(Id) FROM Tbl WHERE Name IS NULL
SELECT COUNT(Name) FROM Tbl WHERE Name IS NULL

La première déclaration renvoie correctement 1 tandis que la seconde déclaration donne 0 . Why ou How ?

0voto

onedaywhen Points 24594

En * en COUNT(*) n'est pas la même * en SELECT * FROM...

SELECT COUNT(*) FROM T; signifie très précisément la cardinalité de l'expression du tableau T .

SELECT COUNT(1) FROM T; produira les mêmes résultats que COUNT(*) mais si le contenu des parenthèses n'est pas * il doit être analysé.

SELECT COUNT(c) FROM T; donde c est une colonne nullable dans le tableau T comptera les valeurs non nulles.

P.S. Je suis à l'aise avec l'utilisation de SELECT * FROM... dans les bonnes circonstances.

P.P.S. Votre "table" n'a pas de clé : considérez INSERT INTO Tbl VALUES ('John', 'John', 'John', NULL, NULL, NULL); serait autorisé par les résultats serait un non-sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X