PostgreSQL'de bir Seçim sorgusunda varsayılan bir değeri nasıl kullanabilirim?


32

Satır döndürülmezse kullanılması gereken bir sütun için varsayılan bir değer kullanmak istiyorum. PostgreSQL'de bu mümkün mü? Nasıl yapabilirim? Yoksa bunu çözebileceğim başka bir yol var mı?

Örneğin böyle bir şey:

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

org_id = 3Tabloda hiç satır yoksa geri dönmek istiyorum 0.

Yanıtlar:


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

veya

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) komutunun null1 satır varken olmasını istiyorsanız, ancak post_id null olur.

dbfiddle


13

Göstermek istersen 0Sorgunuz 0 satır döndürdüğünde (alas 1 satır) istiyorsanız, şunu kullanabilirsiniz:

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 

Yukarıdaki ad, ad alanı için varsayılan ad kullanmak istediğinizde çalışmaz ve sadece sayı alanını kullanırsanız çalışır. Aşağıdaki sorgu, tüm alan türleri için çalışır.

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

2

Yukarıdakilerin hiçbirini işe alamıyorum.

İşte bunun için çalışırken bulduğum şey:

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

Zarif bir çözüm değil, işin farkındayım.


1
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3benim için iyi çalışıyor.
Jonas

2
@ mmandk9 "işe yaramadı" konusunda detaylı bir şekilde çalışabilir misiniz?
Jack Douglas

-2

Satır bulunmazsa sadece varsayılan değeri döndür:

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

IFNULLPostgres'te (veya standart SQL'de) geçerli bir sözdizimi değildir. MySQL'de kullanılır.
Erwin Brandstetter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.