Renvoie une valeur si aucune ligne n’est trouvée SQL

Voici ma requête simple. Si je demande un enregistrement qui n’existe pas, je n’obtiendrai aucun résultat. Je préférerais que false (0) soit renvoyé dans ce scénario. Vous cherchez la méthode simpliste pour ne pas tenir compte des enregistrements.

SELECT CASE WHEN S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1) THEN 1 ELSE 0 END AS [Value] FROM Sites S WHERE S.Id = @SiteId 

 SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END AS [Value] FROM Sites S WHERE S.Id = @SiteId and S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1) 

Ceci est similaire à celui d’Adam Robinson, mais utilise ISNULL au lieu de COUNT.

 SELECT ISNULL( (SELECT 1 FROM Sites S WHERE S.Id = @SiteId and S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1)), 0) 

Si la requête interne a une ligne correspondante, alors 1 est renvoyé. La requête externe (avec ISNULL) renvoie alors cette valeur de 1. Si la requête interne n’a pas de ligne correspondante, elle ne renvoie rien. La requête externe traite cela comme un NULL, et donc le ISNULL retourne 0.

Cela peut être un cheval mort, une autre façon de retourner une ligne quand il n’y a pas de lignes est de lancer une autre requête UNION et d’afficher les résultats quand ils n’existent pas dans la table.

 SELECT S.Status, COUNT(s.id) AS StatusCount FROM Sites S WHERE S.Id = @SiteId GROUP BY s.Status UNION ALL --UNION BACK ON TABLE WITH NOT EXISTS SELECT 'N/A' AS Status, 0 AS StatusCount WHERE NOT EXISTS (SELECT 1 FROM Sites S WHERE S.Id = @SiteId ) 

Quelque chose comme:

 if exists (select top 1 * from Sites S where S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1)) select 1 else select 0 

J’ai lu toutes les réponses ici, et il a fallu du temps pour comprendre ce qui se passait. Ce qui suit est basé sur la réponse de Moe Sisko et quelques recherches connexes

Si votre requête SQL ne renvoie aucune donnée, il n’y a pas de champ avec une valeur NULL, donc ni ISNULL ni COALESCE ne fonctionneront comme vous le souhaitez. En utilisant une sous-requête, la requête de niveau supérieur obtient un champ avec une valeur nulle, et ISNULL et COALESCE fonctionneront comme vous le souhaitez / attendez.

Ma requête

 select isnull( (select ASSIGNMENTM1.NAME from dbo.ASSIGNMENTM1 where ASSIGNMENTM1.NAME = ?) , 'Nothing Found') as 'ASSIGNMENTM1.NAME' 

Ma requête avec des commentaires

 select isnull( --sub query either returns a value or returns nothing (no value) (select ASSIGNMENTM1.NAME from dbo.ASSIGNMENTM1 where ASSIGNMENTM1.NAME = ?) --If there is a value it is displayed --If no value, it is perceived as a field with a null value, --so the isnull function can give the desired results , 'Nothing Found') as 'ASSIGNMENTM1.NAME' 

Aucun enregistrement correspondant ne signifie aucun enregistrement retourné. Il n’y a pas de place pour la “valeur” de 0 si aucun enregistrement n’est trouvé. Vous pouvez créer une requête UNION délirante pour faire ce que vous voulez, mais beaucoup, beaucoup, beaucoup mieux simplement pour vérifier le nombre d’enregistrements dans le jeu de résultats.

Il suffit de remplacer le WHERE par un LEFT JOIN:

 SELECT CASE WHEN S.Id IS NOT NULL AND S.Status = 1 AND ...) THEN 1 ELSE 0 END AS [Value] FROM (SELECT @SiteId AS Id) R LEFT JOIN Sites S ON S.Id = R.Id 

Cette solution vous permet également de renvoyer des valeurs par défaut pour chaque colonne, par exemple:

 SELECT CASE WHEN S.Id IS NULL THEN 0 ELSE S.Col1 END AS Col1, S.Col2, ISNULL(S.Col3, 0) AS Col3 FROM (SELECT @Id AS Id) R LEFT JOIN Sites S ON S.Id = R.Id AND S.Status = 1 AND ... 

Et avec TIES?

 SELECT TOP 1 WITH TIES tbl1.* FROM (SELECT CASE WHEN S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1) THEN 1 ELSE 0 AS [Value] FROM Sites S WHERE S.Id = @SiteId) as tbl1 ORDER BY tbl1.[Value] 

Cela pourrait être un moyen.

 SELECT TOP 1 [Column Name] FROM (SELECT [Column Name] FROM [table] WHERE [conditions] UNION ALL SELECT 0 )A ORDER BY [Column Name] DESC