问题描述
"AB=10,AC=11,AC=12,AC=13,AD=14,AD=15,AD=16"
并且我想将数字放在不同的列中,为每列提供您可以在与此数字关联的 =
之前的字符串中找到的名称。
所以在这里,我想有 7 个这样的列
AB | AC1 | AC2 | AC3 | AD1 | AD2 | AD3 |
---|---|---|---|---|---|---|
10 | 11 | 12 | 13 | 14 | 15 | 16 |
编辑:这个结构是固定的,我们总是有一个 AB、三个 AC 和三个 AD。
我的问题是我们有 3 次出现 AC
和 3 次出现 AD
,我无法访问包含在 AC
和 {{ 2nd 和 3rd 中的数据1}}。我尝试了 AD
和 PATINDEX
并且总是只到达第一次出现。
是否可以在单个 CHARINDEX
查询中完成?
解决方法
您可以尝试基于 JSON 的方法。您需要将输入转换为具有适当结构的有效 JSON(npm cache clean --force
到 'AB=10,AC=11,AC=12,AC=13,AD=14,AD=15,AD=16
)并使用 [{"AB":10},{"AC":11},{"AC":12},{"AC":13},{"AD":14},{"AD":15},{"AD":16}
解析它:
JSON_VALUE()
结果:
DECLARE @input nvarchar(max) = N'AB=10,AD=16'
SET @input = CONCAT('[{"',REPLACE(REPLACE(@input,','"},{"'),'=','":"'),'"}]')
SELECT
JSON_VALUE(@input,'$[0].AB') AS AB,JSON_VALUE(@input,'$[1].AC') AS AC1,'$[2].AC') AS AC2,'$[3].AC') AS AC3,'$[4].AD') AS AD1,'$[5].AD') AS AD2,'$[6].AD') AS AD3
如果数据存储在表中:
AB AC1 AC2 AC3 AD1 AD2 AD3
10 11 12 13 14 15 16