You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:24:03