【问题标题】:PostgreSql : using a statement as case conditionPostgreSql:使用语句作为案例条件
【发布时间】:2015-04-26 06:40:12
【问题描述】:

当我使用一个语句作为 case 条件 它总是返回 false;

select * from table order by (case when (true) then id else 1/0 end)  desc -- works 
select * from table order by (case when (select true) then id else 1/0 end)  desc -- exception
select * from table order by (case when (1=1) then id else 1/0 end)  desc -- works
select * from table order by (case when (select 1=1) then id else 1/0 end)  desc -- exception

这种情况有什么问题?

【问题讨论】:

    标签: postgresql case-when


    【解决方案1】:

    CASE WHEN 期望 boolean 根据documentation 的条件得出结果:

    每个条件都是一个返回布尔结果的表达式。

    SELECT 语句返回一个关系(是的,单行有一个列,类型为boolean,值为TRUE,但这仍然不是@987654328 @)。

    【讨论】:

    • 好的,有什么办法可以将该相关转换为布尔值!我试图用 ::boolean 运算符转换它。它不起作用。
    • 是的,select 语句返回一个关系,但表达式中使用了来自scalar subquery (select...) 的单个返回值。
    【解决方案2】:

    子查询(select true)返回一个布尔值:

    select (select true);
     bool 
    ------
     t
    

    case 有效:

    select (case when (select true) then 1 else 0 end);
     case 
    ------
        1
    

    问题是else 表达式总是被计算:

    select (case when (select true) then 1 else 1/0 end);
    ERROR:  division by zero
    

    改为除以转换为整数的条件:

    select 1/true::integer;
     ?column? 
    ----------
            1
    
    select 1/false::integer;
    ERROR:  division by zero
    

    您的示例代码将是:

    select *
    from table
    order by id/(my_condition)::integer desc
    

    顺便说一句,您确定要引发异常吗?

    【讨论】:

    • "总是计算 else 表达式" contradicts with the manual: "如果条件的结果为真,则 CASE 表达式的值是条件,不处理 CASE 表达式的其余部分"
    • @a_horse_with_no_name 当条件涉及不正确的子选择时,如我的示例所示。
    • @a_horse_with_no_name 措辞不清楚。 CASE 表达式的其余部分 是什么?其他when 条件?
    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多