我有一个 PostgreSQL 9.6 表,如下所示:
range (string) count suburb
-------------- ------ ------
< 200,000 1 NEDLANDS
400,000 to 599,000 4 NEDLANDS
600,000 to 799,000 5 NEDLANDS
> 2 1 NEDLANDS
如果范围的计数为 0,则表中没有记录,但我希望我的查询返回每个范围并在不存在记录的情况下报告 0。因此,对于上表,所需的结果集将是:
range (string) count
-------------- ------
<200,000 1
200,000 to 400,000 0
400,000 to 599,000 4
600,000 to 799,000 5
800,000 to 1m 0
1m > 2m 0
> 2 1
我以为我可以联合
查找记录的查询与未找到记录的查询,但我的查询仍然没有找到 0 条记录:
select range, count
from sales
where suburb = 'NEDLANDS'
union all
select range, 0 as count from sales
where not exists (select range, count
from sales
where suburb = 'NEDLANDS' );
有什么我想念的吗?
最佳答案
最好的方法是创建一个包含有效范围列表的表格,例如 valid_ranges
- 每个有效范围标题都有一行。
那你可以走了
SELECT vr.range, s.count
FROM valid_ranges vr
LEFT JOIN sales s ON vr.range = s.range
WHERE s.suburb = 'NEDLANDS' OR s.suburb IS NULL;
最后一行有点奇怪。 'IS NULL' 子句用于缺少的行,但要使其正常工作,郊区不得为可为空的列。
如果 suburb 可以为 null,则可以重组:
SELECT vr.range, n.count
FROM valid_ranges vr
LEFT JOIN (SELECT range, count FROM sales
WHERE suburb = 'NEDLANDS') n
ON vr.range = n.range;
如果您无法创建有效范围表,则可以改为从销售表中获取所有范围。但这有一个风险,即如果没有具有该范围的郊区,那么它就不会显示在列表中:
SELECT vr.range, n.count
FROM (SELECT DISTINCT range FROM sales) vr
LEFT JOIN (SELECT range, count FROM sales
WHERE suburb = 'NEDLANDS') n
ON vr.range = n.range;
如果没有行,这些都将在计数中为 NULL。 如果你真的需要那个零,你可以使用 COALESCE:
SELECT vr.range, COALESCE (n.count, 0)
FROM valid_ranges vr
LEFT JOIN (SELECT range, count FROM sales
WHERE suburb = 'REDLANDS') n
ON vr.range = n.range;
(编辑:更正了@craigcaulfield 指出的 COALESCE() 调用)
关于sql - 如果找不到记录,使 PostgreSQL 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47026037/