我有以下代码:
IF i.cd_ver IS NULL OR i.cd_ver = '0'
THEN
--Set value of v_cd_ver
v_cd_ver := CASE i.cd_ver
WHEN NULL
THEN '9'
WHEN '0'
THEN '10'
END;
END if;
" I"是在引用外部表的游标中找到的记录。外部表中的值为NULL或空白:
SELECT cd_ver FROM table_xtl WHERE cd_id = '123';
..这一行空白了。
但是,v_cd_ver
未按预期设置为'9'
。我的解决方法是使用IF THEN
语句而不是它的工作原理。为什么CASE
语句没有按预期工作?
更新: 当我尝试以下时,它起作用了:
v_cd_ver := CASE
WHEN i.cd_ver IS NULL
THEN '9'
WHEN i.cd_ver = '0'
THEN '10'
END;
这是一个错误还是有一些原因导致前者不起作用?
答案 0 :(得分:4)
case i.cd_ver when NULL ...
在逻辑上等同于case when i.cd_ver = NULL ...
您完全清楚这样的比较导致UNKNOWN,而不是TRUE,因此case
表达式会降至默认值,即NULL
。 (要自己测试一下,在else 'x'
之前添加end
然后重新运行,你会看到。)
正确的写作方式是case when i.cd_ver is null then '9' when i.cd_ver = '0' then '10' end
。
答案 1 :(得分:3)
'simple' case expression的形式将值 - i.cd_ver
- 与每个比较表达式进行比较,寻找相同的值。
在一个简单的CASE表达式中,Oracle数据库搜索 expr 等于 comparison_expr 的第一个WHEN ... THEN对并返回 return_expr ...
重要的是" expr 等于 ..."。自nothing is ever equal to null, even itself以来,没有匹配。
要查找空值,您需要搜索案例exprssion:
v_cd_ver := CASE
WHEN i.cd_ver IS NULL THEN '9'
WHEN i.cd_ver = '0' THEN '10'
END;
没有关系,但你确定0,9和10应该被视为字符串吗?
答案 2 :(得分:0)
尝试检查空('')值或template <typename Device, typename T>
struct DenseUpdate<Device, T, ASSIGN> {
void operator()(const Device& d, typename TTypes<T>::Flat params,
typename TTypes<T>::ConstFlat update) {
params.device(d) = update;
}
};