J'ai une requête qui compte le prix de tous les articles entre deux dates. Voici l'instruction select:
SELECT SUM(Price) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
Vous pouvez supposer que toutes les tables ont été correctement configurées.
Si je sélectionne entre deux dates et qu'il n'y a aucun élément dans cette plage de dates, la fonction renvoie NULL comme TotalPrice plutôt que 0.
Comment puis-je m'assurer que si aucun enregistrement n'est trouvé, 0 est renvoyé plutôt que NULL?
La plupart des serveurs de base de données ont une fonction COALESCE , qui renverra le premier argument qui n'est pas nul, donc ce qui suit devrait faire ce que vous voulez:
SELECT COALESCE(SUM(Price),0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
[modifier]
Juste pour clarifier les choses car il semble y avoir beaucoup de discussions sur "COALESCE/ISNULL retournera toujours NULL si aucune ligne ne correspond", essayez cette requête, vous pouvez copier-coller dans SQL Server directement en l'état:
SELECT coalesce(SUM(column_id),0) AS TotalPrice
FROM sys.columns
WHERE (object_id BETWEEN -1 AND -2)
Notez que la clause where exclut toutes les lignes de sys.columns de la considération, mais l'opérateur `` sum '' entraîne toujours le retour d'une seule ligne qui est nulle, ce qui fusionne fixe pour être une seule ligne avec un 0.
J'espère que cela aide à l'expliquer.
SELECT ISNULL(SUM(Price), 0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
Cela devrait faire l'affaire.
SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
SELECT COALESCE(
(SELECT SUM(Price) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate))
, 0)
Si la table contient des lignes dans la réponse, elle renvoie le SUM (Price). Si le SUM est NULL ou s'il n'y a pas de lignes, il retournera 0.
Mettre COALESCE (SUM (Price), 0) ne fonctionne PAS dans MSSQL si aucune ligne n'est trouvée.
Edit: On dirait que tout le monde m'a battu haha
J'ai trouvé la réponse.
ISNULL()
détermine ce qu'il faut faire lorsque vous avez une valeur nulle.
Dans ce cas, ma fonction renvoie une valeur nulle, j'ai donc dû spécifier un 0 à renvoyer à la place.
SELECT ISNULL(SUM(Price), 0) AS TotalPrice
FROM Inventory
WHERE (DateAdded
BETWEEN @StartDate AND @EndDate)
Vous pourriez utiliser
SELECT ISNULL(SUM(ISNULL(Price, 0)), 0)
.
Je suis sûr à 99% que cela fonctionnera.
Oracle/PLSQL:
FONCTION NVL
SELECT NVL(SUM(Price), 0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
Cette instruction SQL retournerait 0
Si la fonction SUM(Price)
renvoyait une valeur nulle. Sinon, elle retournerait la valeur SUM(Price)
.