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.

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


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

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;

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.


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';

IFNULLn'est pas une syntaxe valide dans Postgres (ou SQL standard). Il est utilisé dans MySQL.
Erwin Brandstetter du
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.