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
。我尝试了 PATINDEX
和 CHARINDEX
并且总是只出现第一次出现。
是否可以在单个 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)
我有一个这种格式的字符串
"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
。我尝试了 PATINDEX
和 CHARINDEX
并且总是只出现第一次出现。
是否可以在单个 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)