我有这个问题:
select *,
case when p.amount is null then '1'
else (select count(1)
from Money_paid mp
where mp.post_id = p.id and mp.user_id = :user_id limit 1)
end paid
from Posts p
where p.id = :post_id
如您所见,else
部分的case .. when
部分中存在子查询。现在我想知道,当p.amount is null
为true
时,那个子查询会执行吗?
我问过,因为我可以通过PHP代码实现case .. when
函数并将其从我的查询中删除,所以我的查询将是这样的:
select *,
(select count(1) from Money_paid mp
where mp.post_id = p.id and
mp.user_id = :user_id and
p.amount is not null
limit 1) paid
from Posts p
where p.id = :post_id
// and some php code to implement that condition
总之,如果该子查询针对两种情况(p.amount is null
= true
和p.amount is null
= false
)执行,那么我将进行第二次查询(不{{ 1}})。但是当该条件为case .. when
时,子查询仅才会执行,那么我将使用第一个查询。
那是哪一个?
答案 0 :(得分:1)
否,除非没有其他条件为真,否则不会执行ELSE
。
CASE EXPRESSION
正按照你的顺序逐一评估他的所有条件,所以当满足第一个条件时,案例就会中断。
CASE表达式的计算结果为第一个真实条件。
如果没有真实条件,则评估为ELSE部分。
如果没有真实条件且没有ELSE部分,则评估为NULL。