PostgreSql:使用语句作为案例条件

时间:2015-04-26 06:40:13

标签: postgresql case-when

当我将语句用作案例条件时,它总是返回 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

这种情况有什么问题?

2 个答案:

答案 0 :(得分:1)

根据documentationCASE WHEN期望条件产生boolean结果:

  

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

SELECT语句返回关系(是的,单行包含boolean类型的单个列,值为TRUE但是仍然不是boolean)。

答案 1 :(得分:1)

子查询(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
你确定要提出异常吗?