Як я можу використовувати значення за замовчуванням у запиті Select у 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 чи можете ви детальніше розповісти про "не працює" - в якій версії поштових розсилок ви перебуваєте та яке повідомлення про помилку (якщо таке є)?
Джек Дуглас

-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.