SQL 服务器:请求在每次出现相同子字符串后提取字符串

SQL Server : Request for extracting the strings following each occurence of same substrings

我有一个这种格式的字符串

"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。

我的问题是 AC 出现了 3 次,AD 出现了 3 次,我无法访问第 2 次和第 3 次出现的 AC 中包含的数据,并且AD。我尝试了 PATINDEXCHARINDEX 并且总是只出现第一次出现。

是否可以在单个 SELECT 查询中完成?

您可以尝试基于 JSON 的方法。您需要将输入转换为具有适当结构的有效 JSON('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,AC=11,AC=12,AC=13,AD=14,AD=15,AD=16'
SET @input = CONCAT('[{"', REPLACE(REPLACE(@input, ',', '"},{"'), '=', '":"'), '"}]')

SELECT 
   JSON_VALUE(@input, '$[0].AB') AS AB,
   JSON_VALUE(@input, '$[1].AC') AS AC1,
   JSON_VALUE(@input, '$[2].AC') AS AC2,
   JSON_VALUE(@input, '$[3].AC') AS AC3,
   JSON_VALUE(@input, '$[4].AD') AS AD1,
   JSON_VALUE(@input, '$[5].AD') AS AD2,
   JSON_VALUE(@input, '$[6].AD') AS AD3

结果:

AB  AC1 AC2 AC3 AD1 AD2 AD3
10  11  12  13  14  15  16

如果数据存储在table:

SELECT 
   t.Input,
   JSON_VALUE(CONCAT('[{"', REPLACE(REPLACE(t.Input, ',', '"},{"'), '=', '":"'), '"}]'), '$[0].AB') AS AB,
   JSON_VALUE(CONCAT('[{"', REPLACE(REPLACE(t.Input, ',', '"},{"'), '=', '":"'), '"}]'), '$[1].AC') AS AC1,
   JSON_VALUE(CONCAT('[{"', REPLACE(REPLACE(t.Input, ',', '"},{"'), '=', '":"'), '"}]'), '$[2].AC') AS AC2,
   JSON_VALUE(CONCAT('[{"', REPLACE(REPLACE(t.Input, ',', '"},{"'), '=', '":"'), '"}]'), '$[3].AC') AS AC3,
   JSON_VALUE(CONCAT('[{"', REPLACE(REPLACE(t.Input, ',', '"},{"'), '=', '":"'), '"}]'), '$[4].AD') AS AD1,
   JSON_VALUE(CONCAT('[{"', REPLACE(REPLACE(t.Input, ',', '"},{"'), '=', '":"'), '"}]'), '$[5].AD') AS AD2,
   JSON_VALUE(CONCAT('[{"', REPLACE(REPLACE(t.Input, ',', '"},{"'), '=', '":"'), '"}]'), '$[6].AD') AS AD3
-- change the FROM clause with the real table and column names
FROM (VALUES (N'AB=10,AC=11,AC=12,AC=13,AD=14,AD=15,AD=16')) t (Input)