如何用单条SQL查询将多列电话号码插入专用表?
单条SQL实现多列电话号码迁移
可以通过单条SQL语句完成这个迁移操作,核心是利用UNION ALL将companies表中的多个电话号码列转换为行数据,再插入到phonenrs表中。
示例数据
companies表
| id | tel | tel2 | tel3 | tel4 |
|---|---|---|---|---|
| 1 | 32772373636 | 32724522341 | ||
| 2 | 32783675626 | |||
| 3 | 32968381949 |
期望phonenrs表结果
| id | company_id | phonenr |
|---|---|---|
| 1 | 1 | 32772373636 |
| 2 | 1 | 32724522341 |
| 3 | 2 | 32783675626 |
| 4 | 3 | 32968381949 |
迁移SQL语句
假设phonenrs表的id是自增主键(主流数据库如MySQL、PostgreSQL、SQL Server均支持),可以使用以下语句:
INSERT INTO phonenrs (company_id, phonenr) SELECT id, tel FROM companies WHERE tel IS NOT NULL AND tel != '' UNION ALL SELECT id, tel2 FROM companies WHERE tel2 IS NOT NULL AND tel2 != '' UNION ALL SELECT id, tel3 FROM companies WHERE tel3 IS NOT NULL AND tel3 != '' UNION ALL SELECT id, tel4 FROM companies WHERE tel4 IS NOT NULL AND tel4 != '';
关键说明
UNION ALL用于合并多组查询结果,不会自动去重(适合保留所有有效号码),性能比UNION更高;- 每个
SELECT子句添加WHERE条件,过滤空值和空字符串,避免插入无效的空号码; - 如果phonenrs表的
id不是自增字段,可结合数据库自带的序列函数(如PostgreSQL的nextval()、MySQL的UUID())手动生成唯一标识后插入。
内容的提问来源于stack exchange,提问作者miitchel
相关产品推荐
相关产品推荐

