web-dev-qa-db-fra.com

Renvoie zéro si aucun enregistrement n'est trouvé

J'ai une requête dans une procédure stockée qui additionne certaines valeurs dans une table:

SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res;

Après cela, je soustrais res valeur avec un entier récupéré par une autre requête et retourne le résultat. Si la clause WHERE est vérifiée, tout fonctionne correctement. Mais si ce n'est pas le cas, toute ma fonction retourne est une colonne vide (peut-être parce que j'essaie de soustraire un entier avec une valeur vide).

Comment puis-je faire en sorte que ma requête renvoie zéro si la clause WHERE n'est pas satisfaite?

30
giozh

Vous pourriez:

SELECT COALESCE(SUM(columnA), 0) FROM my_table WHERE columnB = 1 INTO res;

Cela fonctionne, car votre requête a une fonction d'agrégat et par conséquent toujours renvoie une ligne, même si rien n'est trouvé dans la table sous-jacente.

Les requêtes simples sans agrégat renverraient pas de ligne dans un tel cas. COALESCE ne serait jamais appelé et ne pourrait pas vous sauver. Lorsque vous traitez avec une seule colonne, nous pouvons à la place envelopper la requête entière:

SELECT COALESCE( (SELECT columnA FROM my_table WHERE ID = 1), 0)
INTO res;

Fonctionne également pour votre requête initiale:

SELECT COALESCE( (SELECT SUM(columnA) FROM my_table WHERE columnB = 1), 0)
INTO res;

En savoir plus sur COALESCE() dans le manuel .
En savoir plus sur fonctions d'agrégation dans le manuel .
Plus alternatives dans ce dernier post:

57
Erwin Brandstetter

Je ne connais pas postgresql, mais sous SQL Server ou Oracle, l’utilisation d’une sous-requête fonctionnerait comme ci-dessous (sous Oracle, le SELECT 0 serait SELECT 0 FROM DUAL)

SELECT SUM(sub.value)
FROM
( 
  SELECT SUM(columnA) as value FROM my_table
  WHERE columnB = 1
  UNION
  SELECT 0 as value
) sub

Peut-être que cela fonctionnerait aussi pour postgresql?

3
Jim

Vous pouvez aussi essayer: (j'ai essayé et cela a fonctionné pour moi)

SELECT ISNULL((SELECT SUM(columnA) FROM my_table WHERE columnB = 1),0)) INTO res;
0
Aamir Waheed