Como posso usar um valor padrão em uma consulta Select no PostgreSQL?

32

Gostaria de usar um valor padrão para uma coluna que deve ser usada se nenhuma linha for retornada. Isso é possível no PostgreSQL? Como eu posso fazer isso? Ou existe alguma outra maneira de resolver isso?

Por exemplo, algo como isto:

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

E se não houver linhas com org_id = 3na tabela, quero retornar 0.

Jonas
fonte

Respostas:

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;

se você desejar max (post_id) nullquando houver 1 linha, mas post_id for nulo

dbfiddle

Jack Douglas
fonte
13

Se você deseja mostrar 0(infelizmente 1 linha) quando sua consulta retornar 0 linhas, poderá usar:

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

O exemplo acima não funciona se você deseja usar o nome padrão para o campo de nome e funciona apenas se você usar o campo numérico. A consulta abaixo funciona para todos os tipos de campos.

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

Não consigo fazer nenhum dos itens acima funcionar.

Aqui está o que eu achei para trabalhar para isso:

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

Percebo que não é uma solução elegante, mas faz o trabalho.

mmandk9
fonte
11
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3funciona bem para mim.
Jonas
2
@ mmandk9 você pode falar sobre "não funciona" - em qual versão do postgres você está e qual mensagem de erro (se houver) você recebe?
Jack Douglas
-2

Basta retornar o valor padrão se nenhuma linha for encontrada:

SELECT IFNULL(s_stock, 5)
  FROM stock_info 
 WHERE s_product_id = '43';
namrata
fonte
IFNULLnão é uma sintaxe válida no Postgres (ou SQL padrão). É usado no MySQL.
Erwin Brandstetter