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

SQL实现竖线分隔数据拆分与转置的查询方案

拆分竖线分隔内容并转置为列的SQL实现

不同SQL方言的实现方式略有差异,以下是主流数据库的解决方案:

MySQL

适用于MySQL 8.0+(递归CTE)

WITH RECURSIVE split_data AS (
    SELECT 
        UNKNOWN_COLUMN AS original_data,
        1 AS part_num,
        SUBSTRING_INDEX(UNKNOWN_COLUMN, '|', 1) AS split_value,
        SUBSTRING(UNKNOWN_COLUMN, LENGTH(SUBSTRING_INDEX(UNKNOWN_COLUMN, '|', 1)) + 2) AS remaining_data
    FROM your_table
    UNION ALL
    SELECT 
        original_data,
        part_num + 1,
        SUBSTRING_INDEX(remaining_data, '|', 1),
        SUBSTRING(remaining_data, LENGTH(SUBSTRING_INDEX(remaining_data, '|', 1)) + 2)
    FROM split_data
    WHERE remaining_data != ''
)
SELECT split_value AS transposed_column
FROM split_data;

递归逐段拆分每行的竖线分隔内容,最终提取所有拆分出的值作为新列。

适用于MySQL 5.x及以下版本(数字表关联)

先创建一个包含连续数字的辅助表(数字范围覆盖数据中最多的分隔段数):

-- 创建辅助数字表
CREATE TABLE numbers (num INT);
INSERT INTO numbers VALUES (1),(2),(3),(4),(5); -- 根据实际需求调整数字数量

-- 拆分查询
SELECT 
    SUBSTRING_INDEX(SUBSTRING_INDEX(t.UNKNOWN_COLUMN, '|', n.num), '|', -1) AS transposed_column
FROM your_table t
JOIN numbers n ON n.num <= LENGTH(t.UNKNOWN_COLUMN) - LENGTH(REPLACE(t.UNKNOWN_COLUMN, '|', '')) + 1
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(t.UNKNOWN_COLUMN, '|', n.num), '|', -1) != '';

PostgreSQL

利用内置函数一步实现:

SELECT unnest(string_to_array(UNKNOWN_COLUMN, '|')) AS transposed_column
FROM your_table;

string_to_array将字符串转为数组,unnest把数组元素展开为多行,直接得到转置后的列。

SQL Server

适用于SQL Server 2016+(STRING_SPLIT函数)

SELECT value AS transposed_column
FROM your_table
CROSS APPLY STRING_SPLIT(UNKNOWN_COLUMN, '|')
WHERE value != '';

适用于SQL Server 2016以下版本(递归CTE+XML)

WITH split_data AS (
    SELECT 
        UNKNOWN_COLUMN AS original_data,
        CAST('<v>' + REPLACE(UNKNOWN_COLUMN, '|', '</v><v>') + '</v>' AS XML) AS xml_data,
        1 AS part_num
    FROM your_table
    UNION ALL
    SELECT 
        original_data,
        xml_data,
        part_num + 1
    FROM split_data
    WHERE part_num < xml_data.value('count(/v)', 'INT')
)
SELECT xml_data.value('/v[sql:column("part_num")]', 'VARCHAR(MAX)') AS transposed_column
FROM split_data
WHERE xml_data.value('/v[sql:column("part_num")]', 'VARCHAR(MAX)') != '';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:21:07