在postgresql上选择with IF语句

在postgresql上选择with IF语句,sql,postgresql,group-by,Sql,Postgresql,Group By,我有这样一个代码: 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"

我有这样一个代码:

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语句语法似乎在过程中正确使用,而不是在查询中。请改用大小写表达式:

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表达式返回的所有值都需要具有相同的数据类型。因为sumtbl.value是数字,所以大小写的else部分应该返回0个数字,而不是“0”字符串

IF将用于过程中,而不是查询中。请改用大小写表达式:

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表达式返回的所有值都需要具有相同的数据类型。因为sumtbl.value是数字,所以大小写的else部分应该返回0个数字,而不是“0”字符串

替换

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

替换

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


在Postgres中,我建议使用过滤器:


if是控制流逻辑。在处理查询时,您希望了解如何更多地将其视为集合。因此,我们的想法是过滤行并在过滤后将值相加。

在Postgres中,我建议使用filter:


if是控制流逻辑。在处理查询时,您希望了解如何更多地将其视为集合。因此,我们的想法是过滤行,并在过滤后将值相加。

我想我从来没有在同一秒钟内看到过两个答案!谢谢,很好用!你知道为什么if语句会导致这个错误吗?因为在postgresql文档中,我找到了这段代码作为示例:如果a=b,则从eq_prod中选择*;否则从fn_pes中选择*;如果结束@Guillhermestorti:因为if是一个流控制语句,正在执行两个不同的查询,不在查询中。我想我从来没有在同一秒内看到过两个答案!谢谢,很好用!你知道为什么if语句会导致这个错误吗?因为在postgresql文档中,我找到了这段代码作为示例:如果a=b,则从eq_prod中选择*;否则从fn_pes中选择*;如果结束@GuilhermeStorti:因为if是一个流控制语句,正在执行两个不同的查询,不在查询中。谢谢,它工作得很好!你知道为什么if语句会导致这个错误吗?因为在postgresql文档中,我找到了这段代码作为示例:如果a=b,则从eq_prod中选择*;否则从fn_pes中选择*;如果结束@GuilhermeStorti:IF是一个语句,它用于控制结构,即PL/pgSQL代码函数、过程。。。。这是。这是一个什么结构可以嵌套在其他结构中的问题。结构IF表达式然后选择。。。将SQL嵌套在If结构中。性能良好的筑巢。然而,结构选择。。。如果将IF嵌套在SQL中。完全不同的结构。SQL语句启动后,在语句结束之前,只能使用SQL构造。在SQL中,如果PostgreSQL不应该考虑提高可用性和T-SQL一样容易,那么用户可以专注于他们想要达到的目标和如何适应。谢谢,它工作得很好!你知道为什么if语句会导致这个错误吗?因为在postgresql文档中,我找到了这段代码作为示例:如果a=b,则从eq_prod中选择*;否则从fn_pes中选择*;如果结束@GuilhermeStorti:IF是一个语句,它用于控制结构,即PL/pgSQL代码函数、过程。。。。这是。这是一个什么结构可以嵌套在其他结构中的问题。结构IF表达式然后选择。。。将SQL嵌套在If结构中。性能良好的筑巢。然而,结构选择。。。如果将IF嵌套在SQL中。完全不同的结构。SQL语句启动后,在语句结束之前,只能使用SQL构造。在SQL中,如果PostgreSQL不应该考虑提高可用性和T-SQL一样容易,那么用户可以把重点放在他们想要实现的东西上。我也认为这会给我更好的结果,而不是使用if。我没想过这样做很好!我也认为这会给我更好的结果,而不是使用if。我没想过这样做