Oracle PL/SQL如何过滤文本字段中的各类零值、空值及空字符串?
解决方案:过滤文本字段的NULL、空格及所有零值变体
先纠正一个关键的小错误:你原来写的column_1 != null是无效的,SQL中判断非空必须用column_1 IS NOT NULL——因为NULL和任何值的比较结果都是UNKNOWN,永远不会返回true。
接下来给你两个不用枚举零值变体的实用方案,根据你的Oracle版本选择:
方案1:适合Oracle 12c及以上版本(使用VALIDATE_CONVERSION)
利用Oracle 12c引入的VALIDATE_CONVERSION函数判断字段能否转成数字,再结合数字判断过滤零值:
SELECT column_1 FROM table_1 WHERE -- 过滤NULL、空串、全空格(包括单个空格) TRIM(column_1) IS NOT NULL -- 逻辑:要么字段不能转成数字(说明不是零的变体,保留),要么转成数字后不等于0 AND ( VALIDATE_CONVERSION(column_1 AS NUMBER) = 0 OR TO_NUMBER(column_1) != 0 );
TRIM(column_1) IS NOT NULL:一次性过滤掉NULL、空字符串''、以及所有由空格组成的字符串(比如' '、' '),比你原来逐个判断更高效。VALIDATE_CONVERSION(column_1 AS NUMBER):返回1表示字段可以合法转换为数字,0表示不能。不能转换的显然不是零值变体,直接保留;能转换的则判断是否不等于0。
方案2:通用所有Oracle版本(使用正则表达式)
如果你的版本低于12c,用正则表达式匹配所有零值变体并排除:
SELECT column_1 FROM table_1 WHERE TRIM(column_1) IS NOT NULL -- 排除所有由0、小数点组成的字符串(包括各种零的格式) AND NOT REGEXP_LIKE(TRIM(column_1), '^0*\.?0*$');
正则表达式说明:
^:匹配字符串开头0*:零个或多个0\.?:可选的小数点(用转义符\处理特殊字符)0*:零个或多个0$:匹配字符串结尾
这个正则会匹配所有你列举的零值变体(比如'0'、'0.0'、'00.00'、'0.000'、'000.0'),甚至包括像'.0'、'0.'这种边缘情况。如果你的字段可能出现带正负号的零(比如'+0'、'-0'),可以把正则改成^[+-]?0*\.?0*$。
内容的提问来源于stack exchange,提问作者TJK-all-the-way
相关产品推荐
相关产品推荐

