Snowflake中GETXML转VARCHAR保留小数末尾零的技术咨询
解决方案
问题核心是Snowflake通过GET(XMLGET(...), '$')提取XML节点文本时,会自动将数值格式内容解析为NUMBER类型,转VARCHAR时丢失末尾的.0。要保留原始文本格式,可采用以下两种可靠方式:
方法1:用XPATH_STRING直接提取原始文本
XPATH_STRING能直接提取XML节点的文本内容并以字符串返回,不会自动解析数值类型,完美保留原始格式:
SELECT XPATH_STRING(xmldata, '/DeviceInfo/AdditionalInfo/BrowserVersion/text()') AS BrowserVersion FROM CLAIM;
该方法适配所有场景,不管节点内容是带小数的数值还是长文本,都会原样返回XML中的原始内容。
方法2:类型判断+格式化转换
若必须使用XMLGET,可先判断提取值的类型,对数值类型做格式化转换以保留小数部分:
SELECT IFF( TRY_CAST(GET(XMLGET(xmldata, 'BrowserVersion'), '$') AS NUMBER) IS NOT NULL, TO_VARCHAR(GET(XMLGET(xmldata, 'BrowserVersion'), '$'), 'FM999999999.999999999'), GET(XMLGET(xmldata, 'BrowserVersion'), '$')::VARCHAR ) AS BrowserVersion FROM CLAIM;
TRY_CAST用于判断提取值是否为数值类型TO_VARCHAR的FM格式符去除多余空格,同时保留所有有效小数位(包括末尾的0)- 非数值类型的文本内容直接转VARCHAR即可
验证说明
针对你的XML示例,两种方法都会返回240.0;对于长文本内容,也会完整保留原始字符串。
内容的提问来源于stack exchange,提问作者python_dev
相关产品推荐
相关产品推荐

