我在源系统中有值,其中任何负十进制值存储为10.35-(值后减号)
当我想存储这个配置单元时,我希望我希望负号在-10.35之前。
CASE WHEN substring(trim(colName), -1) = '-' THEN
abs(regexp_replace(colName, '[^0-9.]', ''))*-1 ELSE
abs(regexp_replace(colName, '[^0-9.]', '')) END
上述转换工作正常,但如果列包含空值或空值,则抛出NULL指针异常。
如何处理此异常?
答案 0 :(得分:0)
你不需要abs()函数:
select CASE WHEN trim('10.35-') rlike('-$')
THEN regexp_replace('10.35-', '[^0-9.]', '')*-1
ELSE regexp_replace('10.35-', '[^0-9.]', '')
END
返回-10.35
如果值为空,则返回''
- 空值。如果在这种情况下需要null,请使用cast(作为double):
select CASE WHEN '' rlike('-$')
THEN regexp_replace('', '[^0-9.]', '') *-1
ELSE cast(regexp_replace('', '[^0-9.]', '') as double)
END
返回null
但是如果你想首先使用abs()
然后使用cast(as double)
,它会将空字符串转换为null,而abs将无异常地返回null
:
select abs(cast ('' as double))
返回null