sql - 如果找不到记录,使 PostgreSQL 返回值

标签 sql postgresql

我有一个 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/

相关文章:

mysql - 删除发生时触发添加记录

postgresql - 在 PostgreSQL 中通过另一个表的值选择一列

postgresql - 如何在同一数据库中创建包含两个模式的点文件?(PostgreSQL)

json - PostgreSQL如何根据json attribs条件查询json数据

postgresql - docker + 港 : [PostgreSQL error] failed to retrieve PostgreSQL server_version_num: connection refused

sql - 在 PostgreSql 的 jsonb 中没有键的嵌套搜索

sql - 如何找出 spid 状态暂停的原因? spid 正在等待什么资源?

mysql - 如何修复 "1054 - unknown column on clause"

sql - 将多行组合在一起

SQL:选择包含完全给定成员的集合