当我将语句用作案例条件时,它总是返回 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
这种情况有什么问题?
答案 0 :(得分:1)
根据documentation,CASE 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
你确定要提出异常吗?