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

Azure SQL中能否用内置函数实现分隔字符串的Fold操作?

在Azure SQL中实现Scan/Fold字符串前缀生成

当然可以做到!在Azure SQL里,我们完全可以借助内置字符串函数来实现你想要的scan/fold模式,生成所有顺序不变的前缀路径,全程不用递归CTE。

核心思路

先把输入字符串拆分为带顺序的单个元素,然后为每个元素位置生成对应的前缀拼接结果,最后把所有前缀合并成目标格式的字符串。

方法一:利用STRING_SPLIT(支持ordinal参数)

Azure SQL Database已经支持STRING_SPLIT的第三个参数(启用ordinal列),这个参数能帮我们保留拆分后元素的原始顺序,非常关键。

直接执行以下代码即可得到结果:

DECLARE @input NVARCHAR(MAX) = 'A|B|C|D';

SELECT STRING_AGG(path, ',') AS FOLD_Result
FROM (
    -- 为每个元素位置生成对应的前缀路径
    SELECT CONCAT('[', STRING_AGG(t2.value, '|') WITHIN GROUP (ORDER BY t2.ordinal), ']') AS path
    FROM STRING_SPLIT(@input, '|', 1) t1
    -- 自连接获取当前元素及之前的所有元素
    JOIN STRING_SPLIT(@input, '|', 1) t2 ON t2.ordinal <= t1.ordinal
    GROUP BY t1.ordinal
) AS paths;

执行后会输出:[A],[A|B],[A|B|C],[A|B|C|D],完全符合你的需求。

方法二:兼容旧版本的OPENJSON方案

如果你的Azure SQL版本不支持STRING_SPLIT的ordinal参数,可以用OPENJSON来拆分字符串并保留顺序:

DECLARE @input NVARCHAR(MAX) = 'A|B|C|D';
-- 把字符串转成JSON数组格式
DECLARE @json NVARCHAR(MAX) = CONCAT('["', REPLACE(@input, '|', '","'), '"]');

SELECT STRING_AGG(path, ',') AS FOLD_Result
FROM (
    SELECT CONCAT('[', STRING_AGG(t2.value, '|') WITHIN GROUP (ORDER BY CAST(t2.[key] AS INT)), ']') AS path
    FROM OPENJSON(@json) t1
    JOIN OPENJSON(@json) t2 ON CAST(t2.[key] AS INT) <= CAST(t1.[key] AS INT)
    GROUP BY t1.[key]
) AS paths;

关键函数说明

  • STRING_SPLIT/OPENJSON:负责拆分原字符串并保留元素顺序
  • STRING_AGG:将多个元素拼接成单个字符串,配合WITHIN GROUP保证顺序
  • CONCAT:给每个前缀路径添加方括号
  • 自连接逻辑:为每个元素位置获取其所有前置元素,实现前缀生成

这两种方案都只用了Azure SQL的内置函数,没有依赖递归CTE,完美匹配你的要求。

内容的提问来源于stack exchange,提问作者David James Ball

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:17:30