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

Gui*_*rti 12 sql postgresql sum case aggregate-functions

我有这样的代码:

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

Run Code Online (Sandbox Code Playgroud)

它返回给我该错误消息:

SQL Error [42601]: ERROR: syntax error at or near "then"
Run Code Online (Sandbox Code Playgroud)

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

GMB*_*GMB 15

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
Run Code Online (Sandbox Code Playgroud)

笔记:

  • tbl.stage不是 的一部分group by,因此它很可能应该包含在聚合表达式内,而不是在聚合表达式之外

  • 表达式返回的所有值都case需要具有相同的数据类型。由于sum(tbl.value)是数字,else分支应该返回0(数字),而不是'0'(字符串)。


Gor*_*off 5

在 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;
Run Code Online (Sandbox Code Playgroud)

if是控制流逻辑。在处理查询时,您希望了解如何更多地以集合的方式进行思考。所以想法是过滤行并将过滤后的值相加。