Azure Stream Analytics:无SPLIT函数时拆分单列方括号内容为多列
可以通过CROSS APPLY、SUBSTRING、CHARINDEX实现需求
完全可以用这几个函数组合实现不定数量值的拆分,核心思路是先提取方括号内的纯字符串,再通过定位分隔符(默认是JSON数组的逗号)的位置,逐个截取对应值作为列。以下是具体实现方案:
示例SQL代码
假设你的表名为YourTable,目标列名为ColumnA,代码如下:
SELECT 原始值 = t.ColumnA, 列1 = CASE WHEN pos1 > 0 THEN SUBSTRING(清理后字符串, 1, pos1 - 1) ELSE 清理后字符串 END, 列2 = CASE WHEN pos2 > 0 THEN SUBSTRING(清理后字符串, pos1 + 1, pos2 - pos1 - 1) WHEN pos1 > 0 THEN SUBSTRING(清理后字符串, pos1 + 1, LEN(清理后字符串)) ELSE NULL END, 列3 = CASE WHEN pos3 > 0 THEN SUBSTRING(清理后字符串, pos2 + 1, pos3 - pos2 - 1) WHEN pos2 > 0 THEN SUBSTRING(清理后字符串, pos2 + 1, LEN(清理后字符串)) ELSE NULL END, 列4 = CASE WHEN pos3 > 0 THEN SUBSTRING(清理后字符串, pos3 + 1, LEN(清理后字符串)) ELSE NULL END FROM YourTable t -- 提取方括号内的纯字符串,去掉前后的[] CROSS APPLY ( SELECT 清理后字符串 = SUBSTRING(t.ColumnA, CHARINDEX('[', t.ColumnA) + 1, CHARINDEX(']', t.ColumnA) - CHARINDEX('[', t.ColumnA) - 1) ) ca_clean -- 定位第一个逗号的位置 CROSS APPLY ( SELECT pos1 = CHARINDEX(',', 清理后字符串) ) ca_pos1 -- 定位第二个逗号的位置(从第一个逗号后开始找) CROSS APPLY ( SELECT pos2 = CHARINDEX(',', 清理后字符串, pos1 + 1) ) ca_pos2 -- 定位第三个逗号的位置(从第二个逗号后开始找) CROSS APPLY ( SELECT pos3 = CHARINDEX(',', 清理后字符串, pos2 + 1) ) ca_pos3
代码说明
- 提取括号内内容:通过
SUBSTRING结合CHARINDEX找到[和]的位置,截取中间的纯值字符串(比如将[a,b,c,d]转为a,b,c,d)。 - 定位分隔符:通过多次
CROSS APPLY依次定位第N个逗号的位置,为后续截取做准备。 - 截取列值:用
CASE语句判断分隔符是否存在,动态截取对应区间的字符串作为列值。如果某行只有2个值,后续未用到的列会自动填充NULL,适配值数量不固定的场景。
如果你的数据中值的数量可能超过4个,只需继续扩展CROSS APPLY定位更多逗号位置,并新增对应的列截取逻辑即可。
内容的提问来源于stack exchange,提问作者2023hpy
相关产品推荐
相关产品推荐

