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

SQL中如何拆分COALESCE函数返回结果为电话号码、区号两列

问题描述

现有三张数据表:

  • Person_Table
  • Phone_Table
  • Primary_Phone_Table

主手机号表和非主手机号表中存储的所有电话号码格式均为「区号-电话号码」(如123-5434)或Null。需要在SELECT查询中,从Phone_Number字段提取区号,作为单独的Area_Code列输出。

目前使用的查询语句如下:

SELECT person_number,
       COALESCE ((SELECT phone_number
                    FROM Primary_phone_table PPHT
                   WHERE PPHT.person_id = PT.person_id),
                 (SELECT phone_number
                    FROM phone_table PHT
                   WHERE PHT.person_id = PT.person_id)) Phone_Number
  FROM Person_Table PT

期望输出的字段包含:Person_Number、Phone_Number、Area_Code三列。

解决方案

你可以将原有查询作为子查询嵌套,对合并得到的Phone_Number做字符串截取,取第一个-之前的内容作为Area_Code即可,以下是适配绝大多数数据库的通用实现方案:

SELECT 
  person_number,
  Phone_Number,
  CASE 
    WHEN Phone_Number LIKE '%-%' THEN SUBSTRING(Phone_Number, 1, CHARINDEX('-', Phone_Number) - 1)
    ELSE NULL 
  END AS Area_Code
FROM (
  -- 原有获取合并手机号的逻辑
  SELECT 
    person_number,
    COALESCE(
      (SELECT phone_number FROM Primary_phone_table PPHT WHERE PPHT.person_id = PT.person_id),
      (SELECT phone_number FROM phone_table PHT WHERE PHT.person_id = PT.person_id)
    ) AS Phone_Number
  FROM Person_Table PT
) AS T

如果使用特定数据库,可以用更简化的写法:

  • MySQL/PostgreSQL 可使用SUBSTRING_INDEX函数:
SELECT 
  person_number,
  Phone_Number,
  IF(Phone_Number LIKE '%-%', SUBSTRING_INDEX(Phone_Number, '-', 1), NULL) AS Area_Code
FROM (
  SELECT 
    person_number,
    COALESCE(
      (SELECT phone_number FROM Primary_phone_table PPHT WHERE PPHT.person_id = PT.person_id),
      (SELECT phone_number FROM phone_table PHT WHERE PHT.person_id = PT.person_id)
    ) AS Phone_Number
  FROM Person_Table PT
) AS T
  • Oracle 可使用INSTR替代CHARINDEX:
SELECT 
  person_number,
  Phone_Number,
  CASE 
    WHEN INSTR(Phone_Number, '-') > 0 THEN SUBSTR(Phone_Number, 1, INSTR(Phone_Number, '-') - 1)
    ELSE NULL 
  END AS Area_Code
FROM (
  SELECT 
    person_number,
    COALESCE(
      (SELECT phone_number FROM Primary_phone_table PPHT WHERE PPHT.person_id = PT.person_id),
      (SELECT phone_number FROM phone_table PHT WHERE PHT.person_id = PT.person_id)
    ) AS Phone_Number
  FROM Person_Table PT
) AS T

内容的提问来源于stack exchange,提问作者Vishal Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 11:27:03