SQL处理逗号分隔文本列:状态判断与求和需求咨询
PostgreSQL判断逗号分隔数字列是否全为0
方法1:检查是否存在非0数值(最严谨)
直接拆分字符串为数组,展开后检查是否有任何元素转换为数值后不等于0,避免求和法的潜在误判(比如错误码包含正负抵消的情况):
SELECT state, CASE WHEN NOT EXISTS ( SELECT 1 FROM unnest(string_to_array(state, ',')) AS elem WHERE trim(elem)::numeric != 0 ) THEN 'OK' ELSE 'NOK' END AS status FROM your_table;
- 用
trim(elem)处理可能存在的空格(比如"0, 2"这类格式不规范的情况) - 适用于所有错误码为非0数值的场景,包括正负数
方法2:修复求和思路的实现
如果坚持使用求和判断,需要处理元素的空格问题,同时注意局限性:
SELECT state, CASE WHEN (SELECT sum(trim(elem)::numeric) FROM unnest(string_to_array(state, ',')) AS elem) = 0 THEN 'OK' ELSE 'NOK' END AS status FROM your_table;
⚠️ 注意:如果错误码存在正负抵消(比如"3,-3"),求和为0会误判为正常,仅适用于错误码均为正数的场景
方法3:正则表达式快速判断(性能最优)
如果数据格式相对规范,用正则直接匹配全0模式,无需拆分转换,性能更优:
无空格的规范格式
SELECT state, CASE WHEN state ~ '^0(,0)*$' THEN 'OK' ELSE 'NOK' END AS status FROM your_table;
包含空格的不规范格式
SELECT state, CASE WHEN state ~ '^\s*0\s*(,\s*0\s*)*$' THEN 'OK' ELSE 'NOK' END AS status FROM your_table;
内容的提问来源于stack exchange,提问作者Alvaro
相关产品推荐
相关产品推荐

