如何在PostgreSQL的Select查询中使用默认值?


32

我想为如果没有返回行应使用的列使用默认值。在PostgreSQL中有可能吗?我该怎么做?还是有其他方法可以解决这个问题?

例如这样的事情:

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

如果org_id = 3表中没有行,我想返回0

Answers:


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为null

dbfiddle


13

如果要0在查询返回0行时显示(alas 1行),则可以使用:

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对我来说很好。
乔纳斯(Jonas)

2
@ mmandk9您可以详细说明“无效”吗?-您使用的是哪种版本的Postgres,以及收到了什么错误消息(如果有)?
杰克·道格拉斯,

-2

如果未找到任何行,只需返回默认值:

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

IFNULL在Postgres(或标准SQL)中不是有效的语法。在MySQL中使用。
Erwin Brandstetter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.