2009-06-17 4 views
48

J'ai une requête qui compte le prix de tous les articles entre deux dates. Voici l'instruction select:Comment puis-je modifier NULL à 0 lors de l'obtention d'une seule valeur à partir d'une fonction SQL?

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 fais une sélection entre deux dates et il n'y a aucun élément dans cette plage de dates, la fonction retourne NULL comme plutôt que TotalPrice 0.

Comment puis-je faire en sorte que si aucun enregistrement ne trouve, 0 est renvoyé plutôt que NULL?

Répondre

84

La plupart des serveurs de bases de données ont une fonction COALESCE, qui suit devrait faire revenir le premier argument qui est non nul, donc ce que vous voulez:

SELECT COALESCE(SUM(Price),0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

[modifier]

Juste pour clarifier car il semble y avoir beaucoup de discussion sur "COALESCE/ISNULL retournera toujours NULL si aucune ligne ne correspond", essayez cette requête que vous pouvez copier-coller directement dans SQL Server tel quel:

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, mais l'opérateur 'sum' donne toujours une seule ligne retournée null, qui se corrige en une seule ligne avec un 0.

J'espère que cela aide à expliquer.

+0

Si vous lisez la question, il veut que 0 soit retourné s'il n'y avait pas de résultats, cela ne fonctionnera que si le résultat de la somme est nulle – Tetraneutron

+0

@Tetraneutron: Je pense que cela va fonctionner. somme (prix) sera nulle s'il n'y a pas de lignes, mais il y aura toujours exactement une ligne de résultat. – Thilo

+0

COALESCE fonctionne correctement tant que vous obtenez une rangée de retour pour qu'elle fonctionne (ce que vous faites dans ce cas). COALESCE ne vous aidera pas si vous n'obtenez pas de lignes en retour. –

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

Cela devrait faire l'affaire.

6

Edit: On dirait que tout le monde m'a battu à haha ​​

a trouvé la réponse.

ISNULL() détermine ce qu'il faut faire lorsque vous avez une valeur nulle.

Dans ce cas, ma fonction retourne une valeur nulle, donc je besoin de spécifier un 0 à retourner à la place.

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

isnull ou coalesce fonctionnera – BlackTigerX

+0

Je crois que IFNULL est l'équivalent de MySQL, et ISNULL est pour T-SQL de MS . – ojrac

+1

Vous avez l'instruction ISNULL vers l'arrière pour ce que vous essayez de faire. Je pense que vous voulez à la place: SUM (ISNULL (prix, 0)) – JohnFx

9
SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 
+0

Cela le fera – Tetraneutron

+0

Je viens de le tester avec une table vide et il fonctionne RBarry ... – CodeRedick

+0

Voir ma réponse ci-dessous. Utilisez simplement ISNULL (ou COALESCE) deux fois, une fois pour chaque ligne, puis pour la somme. SELECT ISNULL (SUM (ISNULL (prix, 0)), 0)) – dkretz

3

Vous pouvez utiliser

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

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

+5

L'ISNULL interne n'est pas nécessaire, car SUM ignorera simplement les valeurs NULL. – sayap

5
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 (Prix). Si la somme est NULL ou s'il n'y a pas de lignes, elle renverra 0.

Mettre COALESCE (SUM (prix), 0) ne fonctionne pas dans MSSQL si aucune ligne n'est trouvée.

+0

Bien sûr, cela vous empêche d'obtenir plus d'une valeur à la fois dans la table d'inventaire. – Paul

1

ORACLE/PLSQL:

NVL FONCTION

SELECT NVL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

Cette instruction SQL retournerait 0 si le SUM(Price) a retourné une valeur nulle. Sinon, il renvoie la valeur SUM(Price).

-5

La méthode la plus simple consiste simplement à ajouter zéro à votre résultat.

à savoir

$A=($row['SUM'Price']+0); 
echo $A; 

espérons que cette aide !!

+1

Cela peut fonctionner si le démarreur de sujet a un code PHP pour interpréter les résultats, mais si la question est limitée à SQL, cela ne fonctionnera pas comme une réponse. – Vesper

Questions connexes