SQL如何仅对非空全数字手机号字段格式化,空值或非数字保留原值
原SQL存在的问题
- 全数字判断逻辑错误:
LIKE '%[0-9]%'仅能匹配包含任意数字的字符串,无法判断是否为全数字,且多数数据库原生LIKE语法不支持方括号正则规则 - 缺少长度校验:未限制仅10位的数字串参与格式化,会导致长度不符的数字串格式化后出现异常
- SELECT列表末尾
AS phone后多了冗余逗号,严格模式下会触发语法报错
修正后实现逻辑
仅当手机号为10位纯数字时执行格式化,空值、空字符串、非全数字、长度不符的内容均直接返回原始值,不同主流数据库写法如下:
MySQL 版本
SELECT shade, name, CASE WHEN TRIM(COALESCE(phone, '')) = '' THEN phone WHEN phone REGEXP '^[0-9]{10}$' THEN CONCAT('(', SUBSTRING(phone, 1, 3), ') ', SUBSTRING(phone, 4, 3), '-', SUBSTRING(phone, 7, 4)) ELSE phone END AS phone FROM mytable;
PostgreSQL 版本
SELECT shade, name, CASE WHEN TRIM(COALESCE(phone, '')) = '' THEN phone WHEN phone ~ '^[0-9]{10}$' THEN '(' || SUBSTRING(phone, 1, 3) || ') ' || SUBSTRING(phone, 4, 3) || '-' || SUBSTRING(phone, 7, 4) ELSE phone END AS phone FROM mytable;
SQL Server 版本
SELECT shade, name, CASE WHEN TRIM(ISNULL(phone, '')) = '' THEN phone WHEN phone LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' THEN '(' + SUBSTRING(phone, 1, 3) + ') ' + SUBSTRING(phone, 4, 3) + '-' + SUBSTRING(phone, 7, 4) ELSE phone END AS phone FROM mytable;
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

