Come posso usare un valore predefinito in una query Select in PostgreSQL?


32

Vorrei utilizzare un valore predefinito per una colonna che dovrebbe essere utilizzata se non viene restituita alcuna riga. È possibile in PostgreSQL? Come posso farlo? O c'è un altro modo in cui posso risolvere questo?

Ad esempio qualcosa del genere:

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

E se non ci sono righe con org_id = 3nella tabella, voglio tornare 0.

Risposte:


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

o

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

se vuoi che max (post_id) sia nullquando c'è 1 riga ma post_id è nullo

dbfiddle


13

Se si desidera mostrare 0(purtroppo 1 riga) quando la query restituisce 0 righe, è possibile utilizzare:

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 

Quanto sopra non funziona se si desidera utilizzare il nome predefinito per il campo nome e funziona solo se si utilizza il campo numerico. La query seguente funziona per tutti i tipi di campi.

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

2

Non riesco a far funzionare nessuna delle opzioni precedenti.

Ecco cosa ho trovato a lavorare per questo:

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

Realizzo non una soluzione elegante ma fa il lavoro.


1
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3funziona bene per me.
Jonas,

2
@mmandk9 puoi approfondire "non funziona" - su quale versione di Postgres sei e quale messaggio di errore (se presente) ricevi?
Jack Douglas,

-2

Restituisce semplicemente il valore predefinito se non viene trovata alcuna riga:

SELECT IFNULL(s_stock, 5)
  FROM stock_info 
 WHERE s_product_id = '43';

IFNULLnon è una sintassi valida in Postgres (o SQL standard). È usato in MySQL.
Erwin Brandstetter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.