前情提要:需求是过滤掉0和null的数据,阴差阳错通过加查询条件number<>'0’就实现了,但不是最优解
正文:
number<>'0’这个过滤条件,不仅会把值为0的数据过滤掉,还会把null的也过滤掉。
原因:
在进行对比时,会把能转换的字符串进行隐式类型转换,不能转换的报错(ORA-01722: invalid number);
转换之后就是对比环节,会把字符串‘0’转换成数值0,与对应字段对比,等于0的就被过滤掉了,但为null的数据被过滤了另有原因,我要知其然知其所以然!
一个细节是,Oracle会把对比结果为unknown的行过滤掉,而当字段number中为null值的数据和0对比时,会返回unknown,所以也被过滤掉了。
还有一个点就是,不管null和谁对比,都会返回unknow,包括null本身,被过滤是肯定的啦!
或许AI老师说的好理解,上图先,如下:
请添加图片描述
请添加图片描述
其实隐式转化会有报错以及性能问题,所以最好通过函数to_number()显示转换字符串为数值类型。
优化写法:number is not null and number<>to_number(‘0’);

一些函数用法
nvl(number,-1) 会把number为null的值替换为指定值-1。

COALESCE(expr1, expr2, …, exprN)
如果第一个表达式不为空,则返回该表达式的值。
如果第一个表达式为空,则检查第二个表达式,依此类推。
如果所有表达式都为空,则返回最后一个表达式的值。

NULLIF(a,b)
如果a和b的值相等就返回null,不相等就返回a的值。

DECODE(expr, search1, result1, search2, result2, …, default)
如果 expr 等于某个 search 值,则返回相应的 result。
如果 expr 不等于任何一个 search 值,则返回 default。

晚安玛卡巴卡( ̄▽ ̄*)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐