Jak mogę użyć wartości domyślnej w zapytaniu Select w PostgreSQL?


32

Chciałbym użyć wartości domyślnej dla kolumny, której należy użyć, jeśli nie zostaną zwrócone żadne wiersze. Czy jest to możliwe w PostgreSQL? Jak mogę to zrobić? Czy jest jakiś inny sposób na rozwiązanie tego problemu?

Np. Coś takiego:

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

A jeśli org_id = 3w tabeli nie ma wierszy , chcę wrócić 0.

Odpowiedzi:


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

lub

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

jeśli chcesz, aby max (post_id) był, nullgdy jest 1 wiersz, ale post_id ma wartość null

dbfiddle


13

Jeśli chcesz pokazać 0(niestety 1 wiersz), gdy zapytanie zwraca 0 wierszy, możesz użyć:

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 

Powyższe nie działa, jeśli chcesz użyć domyślnej nazwy dla pola nazwy i działa tylko, jeśli używasz pola liczbowego. Poniższe zapytanie działa dla wszystkich typów pól.

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

2

Nie mogę zmusić żadnego z powyższych do pracy.

Oto, co znalazłem do pracy:

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

Zdaję sobie sprawę, że nie jest to eleganckie rozwiązanie, ale spełnia swoje zadanie.


1
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3działa dobrze dla mnie.
Jonas

2
@ mmandk9, czy możesz rozwinąć temat „nie działa” - na jakiej wersji postgres jesteś i jaki komunikat o błędzie (jeśli w ogóle) otrzymujesz?
Jack Douglas

-2

Zwróć wartość domyślną, jeśli nie zostaną znalezione wiersze:

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

IFNULLnie jest poprawną składnią w Postgresie (lub standardowym SQL). Jest używany w MySQL.
Erwin Brandstetter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.