在postgresql上使用IF语句进行选择

baubqpgj  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(3)|浏览(266)

我有一个准则:

select
    tbl.person
    ,COUNT(distinct tbl.project)
    ,if (tbl.stage like '%SIGNED%') then sum(tbl.value) else '0' end if as test
from
    my_table tbl
group by
1

它返回错误消息:

SQL Error [42601]: ERROR: syntax error at or near "then"

我不明白。正如我在文档中看到的,if语句语法似乎使用正确

b4lqfgs4

b4lqfgs41#

IF将在过程中使用,而不是在查询中使用。请改用case表达式:

select
    tbl.person
    ,COUNT(distinct tbl.project)
    ,sum(case when tbl.stage like '%SIGNED%' then tbl.value else 0 end) as test
from
    my_table tbl
group by
1

注:

  • tbl.stage不是group by的一部分,因此它很可能应包含在聚合表达式内,而不是聚合表达式外
  • case表达式返回的所有值需要具有相同的数据类型。由于sum(tbl.value)是数字,因此else分支应返回0(数字),而不是'0'(字符串)。
qvk1mo1f

qvk1mo1f2#

在Postgres中,我建议使用filter

select tbl.person, COUNT(distinct tbl.project)
       sum(tbl.value) filter (where tbl.stage like '%SIGNED%') as test
from my_table tbl
group by 1;

if是控制流逻辑。当使用查询时,您希望学习如何将更多的内容视为集合。因此,我们的想法是筛选行,并在筛选后将值相加。

z9gpfhce

z9gpfhce3#

替换

if (tbl.stage like '%SIGNED%') then sum(tbl.value) else '0' end if as test

sum(case when tbl.stage like '%SIGNED%' then tbl.value end) as test

相关问题