PL/SQL中Case When的Else分支是否被忽略?为何我的Else分支不生效?
问题分析与解决方案
我看了你的代码和示例数据,先帮你拆解下当前逻辑的执行结果,你就能明白为什么会觉得Else分支“不生效”了。
首先,你的CASE条件是:mod(Id,10) < (Id/10),也就是个位数字 < 十位数字时返回原数,否则返回数字反转。我们用你的示例数据跑一遍实际执行情况:
| Id | 个位数字(mod结果) | 十位数字(Id/10取整) | 条件是否成立 | 最终返回值 |
|---|---|---|---|---|
| 21 | 1 | 2 | 是 | 21 |
| 12 | 2 | 1 | 否 | 21 |
| 34 | 4 | 3 | 否 | 43 |
| 43 | 3 | 4 | 是 | 43 |
| 29 | 9 | 2 | 否 | 92 |
| 92 | 2 | 9 | 是 | 92 |
你觉得Else分支不生效,大概率是你的条件逻辑和预期需求搞反了:
- 如果你希望当个位数字 > 十位数字时返回原数,否则反转,那你的条件应该写成
mod(Id,10) > (trunc(Id/10)); - 如果你确实是想让“个位<十位时返回原数,否则反转”,那当前代码本身是没问题的——比如Id=12、34、29都走了Else分支,返回的是反转后的数字,只是你可能误解了某些数据的执行分支。
另外补充一个细节:在部分数据库中,整数除法Id/10可能返回浮点数(比如PostgreSQL),虽然你用cast转成number(5)没问题,但更稳妥的方式是用整数截断函数,比如Oracle的trunc(Id/10),避免浮点数带来的潜在问题。
修正后的代码(假设你希望个位>十位时返回原数,否则反转)
select Id, case when mod(Id,10) > trunc(Id/10) then Id -- 直接返回原数,无需拼接 else mod(Id,10)*10 + trunc(Id/10) end Col from Test;
内容的提问来源于stack exchange,提问作者aprkturk
相关产品推荐
相关产品推荐

