You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL求助:如何将行内字符串拆分后转为对应列输出?

SQL实现字符串拆分并按位置对齐输出

问题说明

现有数据表:

Company
APPLE
GOOGLE

需要将两个公司名称拆分为单个字符,按位置对齐,短字符串补空,得到如下结果:

OneTwo
AG
PO
PO
LG
EL
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;

代码说明

  1. TRIM(Company):去除原始数据中公司名称前后的空格,避免提取到无效空格。
  2. SUBSTRING(字符串, 位置, 长度):提取指定位置的单个字符,当位置超出字符串长度时返回NULL,显示为空,符合预期。
  3. 位置序列生成:确保覆盖最长字符串的所有位置(这里GOOGLE是6位,所以生成1-6),保证短字符串的后续位置能显示为空。

内容的提问来源于stack exchange,提问作者gul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:22:20