web-dev-qa-db-fra.com

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

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 avec org_id = 3 dans le tableau que je veux renvoyer 0.

35
Jonas
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 null quand il y a 1 ligne mais post_id est null

dbfiddle

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

SELECT COALESCE( 
        ( SELECT MAX(post_id) FROM my_table WHERE org_id = 3 )
               , 0) AS max_id
14
ypercubeᵀᴹ
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;
7
seenimurugan

Je ne parviens pas à faire fonctionner les éléments ci-dessus.

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.

3
mmandk9