Как я могу использовать значение по умолчанию в запросе выбора в PostgreSQL?


32

Я хотел бы использовать значение по умолчанию для столбца, который следует использовать, если строки не возвращаются. Это возможно в PostgreSQL? Как я могу это сделать? Или есть другой способ решить эту проблему?

Например, что-то вроде этого:

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

И если org_id = 3в таблице нет строк, которые я хочу вернуть 0.

Ответы:


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

или

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

если вы хотите, чтобы max (post_id) был, nullкогда есть 1 строка, но post_id равен нулю

dbfiddle


13

Если вы хотите показать 0(увы 1 строка), когда ваш запрос возвращает 0 строк, то вы можете использовать:

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 

Вышеприведенное не работает, если вы хотите использовать имя по умолчанию для поля имени, и оно работает, только если вы используете числовое поле. Приведенный ниже запрос работает для всех типов полей.

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

2

Я не могу заставить что-либо из вышеперечисленного работать.

Вот что я нашел для этого:

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

Я понимаю, не элегантное решение, но делает работу.


1
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3прекрасно работает для меня
Джонас

2
@ mmandk9 Вы можете уточнить, что «не работает» - на какой версии postgres вы работаете и какое сообщение об ошибке (если есть) вы получаете?
Джек Дуглас

-2

Просто верните значение по умолчанию, если строк не найдено:

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

IFNULLнедопустимый синтаксис в Postgres (или стандартный SQL). Он используется в MySQL.
Эрвин Брандштеттер,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.