web-dev-qa-db-fra.com

Comment puis-je changer NULL à 0 lors de l'obtention d'une valeur unique à partir d'une fonction SQL?

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?

55
Matt

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.

98
Jonathan Rupp
SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)

Cela devrait faire l'affaire.

13
Joseph
SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice
FROM Inventory
WHERE (DateAdded BETWEEN @StartDate AND @EndDate)
11
BlackTigerX
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.

6
Paul

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)
6
Matt

Vous pourriez utiliser

SELECT ISNULL(SUM(ISNULL(Price, 0)), 0).

Je suis sûr à 99% que cela fonctionnera.

4
dkretz

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).

1
tharindu_DG