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.

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


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

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;

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.


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

IFNULList in Postgres (oder Standard-SQL) keine gültige Syntax. Es wird in MySQL verwendet.
Erwin Brandstetter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.