计算字符串中单独出现的次数 T-SQL
Counting separate occurrences in a string T-SQL
我需要帮助来计算 'pattern' 在一个字符串中出现的次数。我正在使用将输入的模式提取到列中的工具。我的日期集如下所示:
Id
MatchedPatterns
1
"[Pattern One: SE09B00218], [Pattern Two: 0000000-09000,0974837-01]"
2
"[Pattern One: SE09B00218,DA02F11418], [Pattern Two: 0000000-09,0974837-01]"
3
"[Pattern One: TR38G01678,DA02F11418,KJ73F4567]"
4
"[Pattern Two: 0000009-00000007,1234567-02,0939485-0004,09836473-1]"
可以看到每个模式都可以找到多次(最多200次),用逗号分隔也可以为空。识别的每个模式也可以是不同的长度。
这是我希望输出的样子:
Id
PatternOneCount
PatternTwoCount
1
1
2
2
2
2
3
3
0
4
0
4
这可能吗?
非常感谢
假设您使用的是(完全)受支持的 SQL 服务器版本,您可以将数据转换为有效的 JSON,然后使用它。
所以首先你REPLACE
括号([]
)用双引号("
),冒号(:
)也用双引号引起来.然后将整个字符串用大括号 ({}
) 包裹起来,以获得 JSON 字符串。
接下来使用 JSON 和 OPENJSON
,使用 STRING_SPLIT
拆分分隔数据,然后 最后 使用条件聚合。 .. 恶心.
SELECT V.Id,
COUNT(CASE J.[key] WHEN 'Pattern One' THEN SS.[value] END) AS PatternOne,
COUNT(CASE J.[key] WHEN 'Pattern Two' THEN SS.[value] END) AS PatternTwo
FROM (VALUES(1,'[Pattern One: SE09B00218], [Pattern Two: 0000000-09000,0974837-01]'),
(2,'[Pattern One: SE09B00218,DA02F11418], [Pattern Two: 0000000-09,0974837-01]'),
(3,'[Pattern One: TR38G01678,DA02F11418,KJ73F4567]'),
(4,'[Pattern Two: 0000009-00000007,1234567-02,0939485-0004,09836473-1]'))V(Id,MatchedPatterns)
--Make the pattern valid JSON
CROSS APPLY (VALUES(REPLACE(TRANSLATE(V.MatchedPatterns,'[]','""'),': ','":"')))R(JsonPatterns)
CROSS APPLY OPENJSON(CONCAT('{',R.JsonPatterns,'}')) J
OUTER APPLY STRING_SPLIT(J.[value],',') SS
GROUP BY V.Id;
我需要帮助来计算 'pattern' 在一个字符串中出现的次数。我正在使用将输入的模式提取到列中的工具。我的日期集如下所示:
Id | MatchedPatterns |
---|---|
1 | "[Pattern One: SE09B00218], [Pattern Two: 0000000-09000,0974837-01]" |
2 | "[Pattern One: SE09B00218,DA02F11418], [Pattern Two: 0000000-09,0974837-01]" |
3 | "[Pattern One: TR38G01678,DA02F11418,KJ73F4567]" |
4 | "[Pattern Two: 0000009-00000007,1234567-02,0939485-0004,09836473-1]" |
可以看到每个模式都可以找到多次(最多200次),用逗号分隔也可以为空。识别的每个模式也可以是不同的长度。
这是我希望输出的样子:
Id | PatternOneCount | PatternTwoCount |
---|---|---|
1 | 1 | 2 |
2 | 2 | 2 |
3 | 3 | 0 |
4 | 0 | 4 |
这可能吗?
非常感谢
假设您使用的是(完全)受支持的 SQL 服务器版本,您可以将数据转换为有效的 JSON,然后使用它。
所以首先你REPLACE
括号([]
)用双引号("
),冒号(:
)也用双引号引起来.然后将整个字符串用大括号 ({}
) 包裹起来,以获得 JSON 字符串。
接下来使用 JSON 和 OPENJSON
,使用 STRING_SPLIT
拆分分隔数据,然后 最后 使用条件聚合。 .. 恶心.
SELECT V.Id,
COUNT(CASE J.[key] WHEN 'Pattern One' THEN SS.[value] END) AS PatternOne,
COUNT(CASE J.[key] WHEN 'Pattern Two' THEN SS.[value] END) AS PatternTwo
FROM (VALUES(1,'[Pattern One: SE09B00218], [Pattern Two: 0000000-09000,0974837-01]'),
(2,'[Pattern One: SE09B00218,DA02F11418], [Pattern Two: 0000000-09,0974837-01]'),
(3,'[Pattern One: TR38G01678,DA02F11418,KJ73F4567]'),
(4,'[Pattern Two: 0000009-00000007,1234567-02,0939485-0004,09836473-1]'))V(Id,MatchedPatterns)
--Make the pattern valid JSON
CROSS APPLY (VALUES(REPLACE(TRANSLATE(V.MatchedPatterns,'[]','""'),': ','":"')))R(JsonPatterns)
CROSS APPLY OPENJSON(CONCAT('{',R.JsonPatterns,'}')) J
OUTER APPLY STRING_SPLIT(J.[value],',') SS
GROUP BY V.Id;