SQL求助:如何将行内字符串拆分后转为对应列输出?
SQL实现字符串拆分并按位置对齐输出
问题说明
现有数据表:
| Company |
|---|
| APPLE |
需要将两个公司名称拆分为单个字符,按位置对齐,短字符串补空,得到如下结果:
| One | Two |
|---|---|
| A | G |
| P | O |
| P | O |
| L | G |
| E | L |
| E |
解决方案思路
string_split函数只能拆分字符串为行,但无法保留每个字符的位置序号,所以没法实现按位置对齐。我们需要先生成对应字符位置的数字序列,再逐个提取每个位置的字符,最后关联两个公司的结果。
具体SQL代码
方法1:递归CTE生成位置序列(兼容多数SQL版本)
WITH pos_numbers AS ( SELECT 1 AS pos UNION ALL SELECT pos + 1 FROM pos_numbers WHERE pos < 6 -- 6是两个公司名称中最长的字符数 ) SELECT -- 提取APPLE对应位置的字符,超出长度返回空 SUBSTRING(TRIM(a.Company), p.pos, 1) AS One, -- 提取GOOGLE对应位置的字符 SUBSTRING(TRIM(g.Company), p.pos, 1) AS Two FROM pos_numbers p -- 关联APPLE的记录 LEFT JOIN (SELECT Company FROM YourTable WHERE TRIM(Company) = 'APPLE') a ON 1=1 -- 关联GOOGLE的记录 LEFT JOIN (SELECT Company FROM YourTable WHERE TRIM(Company) = 'GOOGLE') g ON 1=1 ORDER BY p.pos;
方法2:用GENERATE_SERIES生成位置序列(SQL Server 2022+/PostgreSQL等支持)
如果你的数据库支持GENERATE_SERIES函数,代码更简洁:
SELECT SUBSTRING(TRIM(a.Company), p.pos, 1) AS One, SUBSTRING(TRIM(g.Company), p.pos, 1) AS Two FROM GENERATE_SERIES(1,6) p(pos) LEFT JOIN (SELECT Company FROM YourTable WHERE TRIM(Company) = 'APPLE') a ON 1=1 LEFT JOIN (SELECT Company FROM YourTable WHERE TRIM(Company) = 'GOOGLE') g ON 1=1 ORDER BY p.pos;
代码说明
TRIM(Company):去除原始数据中公司名称前后的空格,避免提取到无效空格。SUBSTRING(字符串, 位置, 长度):提取指定位置的单个字符,当位置超出字符串长度时返回NULL,显示为空,符合预期。- 位置序列生成:确保覆盖最长字符串的所有位置(这里GOOGLE是6位,所以生成1-6),保证短字符串的后续位置能显示为空。
内容的提问来源于stack exchange,提问作者gul
相关产品推荐
相关产品推荐

