如果在 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
(没有数量可以总结) =]
您尝试过使用合并功能吗?
如果这对您不起作用,您可以创建一个函数来测试输出。
抱歉我的英语不好
我有一个查询 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
(没有数量可以总结) =]
您尝试过使用合并功能吗?
如果这对您不起作用,您可以创建一个函数来测试输出。
抱歉我的英语不好