如何实现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 -- 只保留有姓名的照顾者行
关键说明
- 兼容性:
UNION ALL、CONCAT_WS、COALESCE是绝大多数SQL版本(MySQL、PostgreSQL、SQL Server等)都支持的函数,不会出现版本兼容问题 - 空值处理:用
COALESCE把NULL转换成空字符串,避免结果中出现无效的NULL值;CONCAT_WS会自动忽略空值,不会出现多余的分号 - 过滤无效行:通过
AND (Carer1_Name IS NOT NULL OR ...)过滤掉两位照顾者都为空的行,避免生成无意义的邮件条目
如果你的原视图已经有其他合并逻辑,可以把分支1替换成你现有的合并代码,只需要保留分支2和分支3来处理拆分场景即可。
内容的提问来源于stack exchange,提问作者Bemberlina
相关产品推荐
相关产品推荐

