如果在 postgres 中找不到记录,如何设置默认值

how to set a value default if no record found in postgres

我有一个查询 return table 中每周记录总和的数组。

查询看起来像这样

with date_ranges (range_name, range_dates) as
              ( values ('week_0', tstzrange ((now()::date-interval '6 days'),  now(), '[]'))
                      , ('week_1', tstzrange ((now()::date-interval '13 days'), (now()::date-interval '6 days')))
                      , ('week_2', tstzrange ((now()::date-interval '20 days'), (now()::date-interval '13 days')))
                      , ('week_3', tstzrange ((now()::date-interval '27 days'), (now()::date-interval '20 days')))
              )
                select range_name, range_dates, sum("transactionTotal") total_amount 
        from "MoneyTransactions" mt
        join date_ranges dr on (mt."entryType" = 'sold' AND mt."createdAt" <@ range_dates)
        group by range_name, range_dates
        order by range_name;

它按预期工作,除了如果一周不包含记录,查询不会 return 任何事情都会跳过它。

我的问题是是否可以 return 一个像 0 这样的默认值。

这是查询的输出

[
        {
            "range_name": "week_0",
            "range_dates": [
                {
                    "value": "2020-09-03T00:00:00.000Z",
                    "inclusive": true
                },
                {
                    "value": "2020-09-09T18:16:42.328Z",
                    "inclusive": true
                }
            ],
            "total_amount": "294450"
        },
        {
            "range_name": "week_1",
            "range_dates": [
                {
                    "value": "2020-08-27T00:00:00.000Z",
                    "inclusive": true
                },
                {
                    "value": "2020-09-03T00:00:00.000Z",
                    "inclusive": false
                }
            ],
            "total_amount": "13800"
        },
        {
            "range_name": "week_2",
            "range_dates": [
                {
                    "value": "2020-08-20T00:00:00.000Z",
                    "inclusive": true
                },
                {
                    "value": "2020-08-27T00:00:00.000Z",
                    "inclusive": false
                }
            ],
            "total_amount": "55200"
        }
    ]

如您所见,week_3 不存在,我只想使 total_amount = 0

使用一个LEFT JOIN,它保留左手的记录,即使在右手没有找到记录table...

with date_ranges (range_name, range_dates) as
              ( values ('week_0', tstzrange ((now()::date-interval '6 days'),  now(), '[]'))
                      , ('week_1', tstzrange ((now()::date-interval '13 days'), (now()::date-interval '6 days')))
                      , ('week_2', tstzrange ((now()::date-interval '20 days'), (now()::date-interval '13 days')))
                      , ('week_3', tstzrange ((now()::date-interval '27 days'), (now()::date-interval '20 days')))
              )
                select range_name, range_dates, sum("transactionTotal") total_amount 
        from
            date_ranges dr
        LEFT JOIN
            "MoneyTransactions" mt
                 on (mt."entryType" = 'sold' AND mt."createdAt" <@ range_dates)
        group by range_name, range_dates
        order by range_name;

更改格式只是为了清楚说明我更改了什么。

您可能还想将 SUM() 更改为 COALESCE(SUM(), 0),以便用 0.[=16 替换任何 NULL(没有数量可以总结) =]

您尝试过使用合并功能吗?

如果这对您不起作用,您可以创建一个函数来测试输出。

抱歉我的英语不好