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
相关产品推荐
相关产品推荐

