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.

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


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

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;

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.


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

IFNULLnão é uma sintaxe válida no Postgres (ou SQL padrão). É usado no MySQL.
Erwin Brandstetter
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.