如何用SQL将多列拆分为含多条记录的单列?
如何将Person表的多name列转换为单name列的多行记录
你需要的是列转行操作,用UNION ALL就能轻松实现——把每个name字段和对应的phone_number单独拆成一条记录,再合并所有结果即可。
核心SQL代码
SELECT phone_number, name_1 AS name FROM Person WHERE name_1 IS NOT NULL -- 可选:过滤空值,避免生成无意义记录 UNION ALL SELECT phone_number, name_2 AS name FROM Person WHERE name_2 IS NOT NULL UNION ALL SELECT phone_number, name_3 AS name FROM Person WHERE name_3 IS NOT NULL UNION ALL SELECT phone_number, name4 AS name -- 注意你表中的列名是name4,不是name_4 FROM Person WHERE name4 IS NOT NULL;
代码说明
UNION ALL:将多个SELECT语句的结果合并成一个结果集,和UNION不同,它不会自动去重,适合保留所有有效name记录的场景- 每个SELECT单独取出
phone_number和一个name列,用AS name把列名统一成你需要的name WHERE name_x IS NOT NULL:避免某个name字段为空时,生成phone_number对应空name的无效记录,不需要过滤的话可以直接去掉这行
测试结果
用你提供的示例数据运行上述代码,会得到完全符合预期的结果:
| phone_number | name |
|---|---|
| 123 | Billy |
| 123 | Bill |
| 123 | Bi |
内容的提问来源于stack exchange,提问作者Devcool
相关产品推荐
相关产品推荐

