SQL如何以空格为分隔符拆分导入后合并为单列的数据集
按空格拆分合并列的可行解决方案
原有代码问题说明
你使用LEFT+CHARINDEX的逻辑本身是成立的,执行失败大概率是因为部分行不存在空格,CHARINDEX返回0后,LEFT函数的长度参数非法报错,在原字段后拼接一个空格即可解决该问题。
分数据库实现方案
SQL Server(你的语法符合SQL Server特征)
低版本通用方案(所有SQL Server版本支持)
通过嵌套CHARINDEX逐位定位分隔符,依次提取每个字段:
SELECT -- 提取第一列ID LEFT(ID_Year_Birth_Education_Marital_Status_Income_Kidhome_Teenhome_D, CHARINDEX(' ', ID_Year_Birth_Education_Marital_Status_Income_Kidhome_Teenhome_D + ' ') - 1) AS ID, -- 提取第二列出生年份 SUBSTRING( ID_Year_Birth_Education_Marital_Status_Income_Kidhome_Teenhome_D, CHARINDEX(' ', ID_Year_Birth_Education_Marital_Status_Income_Kidhome_Teenhome_D + ' ') + 1, CHARINDEX(' ', ID_Year_Birth_Education_Marital_Status_Income_Kidhome_Teenhome_D + ' ', CHARINDEX(' ', ID_Year_Birth_Education_Marital_Status_Income_Kidhome_Teenhome_D + ' ') + 1) - CHARINDEX(' ', ID_Year_Birth_Education_Marital_Status_Income_Kidhome_Teenhome_D + ' ') - 1 ) AS Year_Birth, -- 后续字段以此类推,每次偏移上一个分隔符的位置即可 FROM [dbo].[marketing_campaign$]
高版本简化方案(SQL Server 2022 / Azure SQL 支持)
使用STRING_SPLIT的有序返回参数,配合行转列提取字段,代码更简洁:
SELECT MAX(CASE WHEN ordinal = 1 THEN value END) AS ID, MAX(CASE WHEN ordinal = 2 THEN value END) AS Year_Birth, MAX(CASE WHEN ordinal = 3 THEN value END) AS Education, MAX(CASE WHEN ordinal = 4 THEN value END) AS Marital_Status, -- 按照你需要的字段顺序依次向下添加即可 FROM [dbo].[marketing_campaign$] CROSS APPLY STRING_SPLIT(ID_Year_Birth_Education_Marital_Status_Income_Kidhome_Teenhome_D, ' ', 1) GROUP BY ID_Year_Birth_Education_Marital_Status_Income_Kidhome_Teenhome_D
其他数据库备选方案
- MySQL 8.0+ 可使用
SUBSTRING_INDEX简化拆分:
SELECT SUBSTRING_INDEX(combined_col, ' ', 1) AS ID, SUBSTRING_INDEX(SUBSTRING_INDEX(combined_col, ' ', 2), ' ', -1) AS Year_Birth, SUBSTRING_INDEX(SUBSTRING_INDEX(combined_col, ' ', 3), ' ', -1) AS Education FROM marketing_campaign
- PostgreSQL 可通过转数组按下标取值:
SELECT (STRING_TO_ARRAY(combined_col, ' '))[1] AS ID, (STRING_TO_ARRAY(combined_col, ' '))[2] AS Year_Birth, (STRING_TO_ARRAY(combined_col, ' '))[3] AS Education FROM marketing_campaign
注意事项
如果拆分后发现字段错位,大概率是原始数据中存在本身带空格的字段值,说明导入时识别的分隔符错误,可先导出原始数据集查看真实分隔符(大概率是制表符、多空格或特殊符号),将分隔符统一替换后再拆分即可。
内容的提问来源于stack exchange,提问作者Manas Reddy
相关产品推荐
相关产品推荐

