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

如何实现SQL多列数据拆分为多行?照顾者拆分视图需求

解决方案:用UNION ALL实现条件拆分与合并

不需要依赖高版本SQL的字符串拆分函数,用UNION ALL分分支处理是兼容性最好的方案,完美适配你的需求:

完整SQL示例

假设你的原表名为child_carers,最终视图可以这么写:

-- 分支1:Carers_Together=1时,合并两位照顾者信息
SELECT
  Child_first_name AS Child_Name,
  -- 合并非空的照顾者姓名,用分号分隔
  CONCAT_WS('; ', COALESCE(Carer1_Name, ''), COALESCE(Carer2_Name, '')) AS Carer_Name,
  -- 合并非空的联系方式,用分号分隔
  CONCAT_WS('; ', COALESCE(Carer1_Contact, ''), COALESCE(Carer2_Contact, '')) AS Carer_Contact
FROM child_carers
WHERE Carers_Together = 1
-- 可选:过滤掉两位照顾者都为空的无效行
AND (Carer1_Name IS NOT NULL OR Carer2_Name IS NOT NULL)

UNION ALL

-- 分支2:Carers_Together=0时,拆分Carer1为独立行
SELECT
  Child_first_name AS Child_Name,
  COALESCE(Carer1_Name, '') AS Carer_Name,
  COALESCE(Carer1_Contact, '') AS Carer_Contact
FROM child_carers
WHERE Carers_Together = 0
AND Carer1_Name IS NOT NULL -- 只保留有姓名的照顾者行

UNION ALL

-- 分支3:Carers_Together=0时,拆分Carer2为独立行
SELECT
  Child_first_name AS Child_Name,
  COALESCE(Carer2_Name, '') AS Carer_Name,
  COALESCE(Carer2_Contact, '') AS Carer_Contact
FROM child_carers
WHERE Carers_Together = 0
AND Carer2_Name IS NOT NULL -- 只保留有姓名的照顾者行

关键说明

  1. 兼容性:UNION ALL、CONCAT_WS、COALESCE是绝大多数SQL版本(MySQL、PostgreSQL、SQL Server等)都支持的函数,不会出现版本兼容问题
  2. 空值处理:用COALESCE把NULL转换成空字符串,避免结果中出现无效的NULL值;CONCAT_WS会自动忽略空值,不会出现多余的分号
  3. 过滤无效行:通过AND (Carer1_Name IS NOT NULL OR ...)过滤掉两位照顾者都为空的行,避免生成无意义的邮件条目

如果你的原视图已经有其他合并逻辑,可以把分支1替换成你现有的合并代码,只需要保留分支2和分支3来处理拆分场景即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:08:29