Snowflake(SQL)列值替换:正则提取值为0返回空如何替换为0
问题原因
你当前使用的正则规则\\d+\.\\d+强制要求匹配内容必须包含「小数点+小数部分」,纯整数0不符合这个格式规则,因此匹配失败返回null。
修正方法
分两步调整即可:
- 优化正则规则,把小数点和小数部分设为可选匹配项,兼容整数、小数两类数值格式,从根源解决0无法匹配的问题
- 外层套空值处理函数,把所有匹配失败(比如字段中完全无有效数值)返回的null统一替换为0
不同SQL引擎的最终写法参考:
- 适用于Hive、Spark SQL、Presto/Trino、Oracle等多数引擎的通用写法
COALESCE( CAST(regexp_substr(data, '\\d+(\\.\\d+)?') AS DOUBLE), 0 ) AS Age
- 适用于MySQL的写法
IFNULL( CAST(regexp_substr(data, '\\d+(\\.\\d+)?') AS DECIMAL(10,2)), 0 ) AS Age
正则规则说明:
\\d+(\\.\\d+)?中,(\\.\\d+)?代表「小数点+后续数字」的组合为可选匹配项,既可以识别12.5这类带小数的数值,也可以正常匹配0、30这类纯整数,不会漏匹配整数场景。
内容的提问来源于stack exchange,提问作者YoungboyVBA
相关产品推荐
相关产品推荐

