Bagaimana saya bisa menggunakan nilai default dalam kueri Select di PostgreSQL?

32

Saya ingin menggunakan nilai default untuk kolom yang harus digunakan jika tidak ada baris yang dikembalikan. Apakah itu mungkin di PostgreSQL? Bagaimana saya bisa melakukannya? Atau adakah cara lain yang bisa saya selesaikan?

Misalnya sesuatu seperti ini:

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

Dan jika tidak ada baris org_id = 3dalam tabel saya ingin kembali 0.

Jonas
sumber

Jawaban:

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

atau

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

jika Anda ingin maks (post_id) nullketika ada 1 baris tetapi post_id adalah nol

dbfiddle

Jack Douglas
sumber
13

Jika Anda ingin menampilkan 0(sayangnya 1 baris) ketika kueri Anda mengembalikan 0 baris, maka Anda dapat menggunakan:

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

Di atas tidak berfungsi jika Anda ingin menggunakan nama default untuk bidang nama dan hanya berfungsi jika Anda menggunakan bidang angka. Kueri di bawah ini berfungsi untuk semua jenis bidang ..

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

Saya tidak bisa mendapatkan salah satu di atas bekerja.

Inilah yang saya temukan bekerja untuk ini:

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

Saya menyadari bukan solusi yang elegan tetapi melakukan pekerjaan.

mmandk9
sumber
1
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3bekerja dengan baik untuk saya.
Jonas
2
@ mmandk9 dapatkah Anda menguraikan "tidak berfungsi" - versi postgres apa yang Anda pakai dan pesan kesalahan apa (jika ada) yang Anda dapat?
Jack Douglas
-2

Cukup kembalikan nilai default jika tidak ada baris yang ditemukan:

SELECT IFNULL(s_stock, 5)
  FROM stock_info 
 WHERE s_product_id = '43';
namrata
sumber
IFNULLbukan sintaks yang valid dalam Postgres (atau SQL standar). Ini digunakan di MySQL.
Erwin Brandstetter