Comment puis-je utiliser une valeur par défaut dans une requête Select dans PostgreSQL?

32

Je voudrais utiliser une valeur par défaut pour une colonne qui devrait être utilisée si aucune ligne n'est retournée. Est-ce possible dans PostgreSQL? Comment puis-je le faire? Ou existe-t-il un autre moyen de résoudre ce problème?

Par exemple quelque chose comme ça:

SELECT MAX(post_id) AS max_id DEFAULT 0 FROM my_table WHERE org_id = 3

Et s'il n'y a pas de lignes org_id = 3dans le tableau, je veux revenir 0.

Jonas
la source

Réponses:

42
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3

ou

SELECT case count(*) when 0 then 0 else MAX(post_id) end AS max_id
FROM my_table 
WHERE org_id = 3;

si vous voulez que max (post_id) soit nullquand il y a 1 ligne mais post_id est null

dbfiddle

Jack Douglas
la source
13

Si vous souhaitez afficher 0(hélas 1 ligne) lorsque votre requête renvoie 0 ligne, vous pouvez utiliser:

SELECT COALESCE( 
        ( SELECT MAX(post_id) FROM my_table WHERE org_id = 3 )
               , 0) AS max_id
ypercubeᵀᴹ
la source
7
SELECT 
  coalesce(MAX(post_id),0) AS max_id 
FROM 
  my_table 
WHERE 
  org_id = 3 

Les éléments ci-dessus ne fonctionnent pas si vous souhaitez utiliser le nom par défaut pour le champ de nom et cela ne fonctionne que si vous utilisez le champ de numéro. La requête ci-dessous fonctionne pour tous les types de champs.

SELECT 
  COALESCE(
   (SELECT column_name FROM my_table WHERE id = -1), 
   'default_value'
  ) AS column_name;
vuimurugan
la source
2

Je ne parviens pas à faire fonctionner ce qui précède.

Voici ce que j'ai trouvé pour travailler:

SELECT COALESCE(A.max_id, B.dflt) FROM (
SELECT MAX(post_id) AS max_id FROM my_table WHERE org_id = 3) A
       RIGHT OUTER JOIN (SELECT 0 AS dflt) B
       ON 1 = 1

Je ne réalise pas une solution élégante mais fait le travail.

mmandk9
la source
1
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3fonctionne bien pour moi.
Jonas
2
@ mmandk9 pouvez-vous expliquer "ne fonctionne pas" - sur quelle version de postgres êtes-vous et quel message d'erreur (le cas échéant) obtenez-vous?
Jack Douglas
-2

Renvoyez simplement la valeur par défaut si aucune ligne n'est trouvée:

SELECT IFNULL(s_stock, 5)
  FROM stock_info 
 WHERE s_product_id = '43';
namrata
la source
IFNULLn'est pas une syntaxe valide dans Postgres (ou SQL standard). Il est utilisé dans MySQL.
Erwin Brandstetter du