计算字符串中单独出现的次数 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;