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

如何在MS SQL中将特定格式字符串拆分至4列?

处理特定格式字符串的提取需求

问题背景

有格式如下的字符串:s:6:"module";s:11:"leadCapture";(备注:开头的s无实际意义)

我尝试使用STRING_SPLIT函数拆分字符串:

SELECT value 
into temp
FROM STRING_SPLIT('s:6:"module";s:11:"leadCapture";s:6:"action";s:5:"save2";', ';');

select * from temp;

当前输出

行1: s:6:"module"
行2: s:11:"leadCapture"
行3: s:6:"action"
行4: s:5:"save2"

期望输出

6 - 列1, 
module - 列2, 
11 - 列3, 
leadcapture - 列4. 

解决方案

可以通过字符串提取函数结合行号处理,将拆分后的内容转换成目标格式:

方法1:生成逐行匹配的结果集

WITH split_data AS (
    SELECT 
        value,
        -- 提取数字部分
        SUBSTRING(value, CHARINDEX(':', value)+1, CHARINDEX(':"', value)-CHARINDEX(':', value)-1) AS num,
        -- 提取引号内的名称并转小写
        LOWER(SUBSTRING(value, CHARINDEX(':"', value)+2, CHARINDEX('"', value, CHARINDEX(':"', value)+2)-CHARINDEX(':"', value)-2)) AS name,
        -- 生成行序号用于匹配列位置
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
    FROM STRING_SPLIT('s:6:"module";s:11:"leadCapture";s:6:"action";s:5:"save2";', ';')
    WHERE value <> '' -- 过滤拆分后产生的空值
)
-- 按行序号映射到目标列并合并结果
SELECT CONCAT(num, ' - 列', (rn-1)*2 +1) AS 结果 FROM split_data
UNION ALL
SELECT CONCAT(name, ' - 列', (rn-1)*2 +2) AS 结果 FROM split_data
-- 按列序号排序
ORDER BY 
    CASE 
        WHEN ISNUMERIC(LEFT(结果,1)) = 1 THEN (rn-1)*2 +1 
        ELSE (rn-1)*2 +2 
    END;

方法2:生成横向列格式结果

如果需要将结果作为横向列展示,可使用条件聚合:

WITH split_data AS (
    SELECT 
        value,
        CAST(SUBSTRING(value, CHARINDEX(':', value)+1, CHARINDEX(':"', value)-CHARINDEX(':', value)-1) AS INT) AS num,
        LOWER(SUBSTRING(value, CHARINDEX(':"', value)+2, CHARINDEX('"', value, CHARINDEX(':"', value)+2)-CHARINDEX(':"', value)-2)) AS name,
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
    FROM STRING_SPLIT('s:6:"module";s:11:"leadCapture";s:6:"action";s:5:"save2";', ';')
    WHERE value <> ''
)
SELECT
    MAX(CASE WHEN rn=1 THEN num END) AS 列1,
    MAX(CASE WHEN rn=1 THEN name END) AS 列2,
    MAX(CASE WHEN rn=2 THEN num END) AS 列3,
    MAX(CASE WHEN rn=2 THEN name END) AS 列4,
    MAX(CASE WHEN rn=3 THEN num END) AS 列5,
    MAX(CASE WHEN rn=3 THEN name END) AS 列6,
    MAX(CASE WHEN rn=4 THEN num END) AS 列7,
    MAX(CASE WHEN rn=4 THEN name END) AS 列8
FROM split_data;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:54:23