Wie kann ich einen Standardwert in einer Select-Abfrage in PostgreSQL verwenden?

32

Ich möchte einen Standardwert für eine Spalte verwenden, die verwendet werden soll, wenn keine Zeilen zurückgegeben werden. Ist das in PostgreSQL möglich? Wie kann ich es tun? Oder gibt es einen anderen Weg, wie ich das lösen kann?

ZB so etwas:

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

Und wenn es keine Zeilen mit org_id = 3in der Tabelle gibt, möchte ich zurückkehren 0.

Jonas
quelle

Antworten:

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

oder

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

Wenn Sie möchten, dass max (post_id) ist, nullwenn 1 Zeile vorhanden ist, post_id jedoch null ist

dbfiddle

Jack Douglas
quelle
13

Wenn Sie 0(leider 1 Zeile) anzeigen möchten, wenn Ihre Abfrage 0 Zeilen zurückgibt, können Sie Folgendes verwenden:

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

Das obige funktioniert nicht, wenn Sie den Standardnamen für das Namensfeld verwenden möchten, und es funktioniert nur, wenn Sie das Nummernfeld verwenden. Die folgende Abfrage funktioniert für alle Arten von Feldern.

SELECT 
  COALESCE(
   (SELECT column_name FROM my_table WHERE id = -1), 
   'default_value'
  ) AS column_name;
seenimurugan
quelle
2

Ich kann keines von beiden zum Laufen bringen.

Folgendes habe ich dafür gefunden:

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

Ich erkenne keine elegante Lösung, sondern erledige den Job.

mmandk9
quelle
1
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3funktioniert gut für mich.
Jonas
2
@ mmandk9 Kannst du näher auf "Funktioniert nicht" eingehen - auf welcher Postgres-Version bist du und welche Fehlermeldung (falls vorhanden) bekommst du?
Jack Douglas
-2

Geben Sie einfach den Standardwert zurück, wenn keine Zeilen gefunden wurden:

SELECT IFNULL(s_stock, 5)
  FROM stock_info 
 WHERE s_product_id = '43';
namrata
quelle
IFNULList in Postgres (oder Standard-SQL) keine gültige Syntax. Es wird in MySQL verwendet.
Erwin Brandstetter