SQL Server:从包含json字符串的nvarchar(max)变量中获取所有字符串出现(标记)

问题描述 投票:0回答:1

我有一个包含json字符串的变量很长。因此数据类型是NVARCHAR(MAX)。在这个json字符串中,有许多相同的标签多次出现。我对标签IncidentName之后的所有值感兴趣。

它在JSON中看起来像这样(但随后嵌套在有时存在的变量数组中,有时不存在):

"IncidentName":"Value1",
"IncidentName":"Value2",
"IncidentName":"Value3"

有人可以帮我构建一个返回所有这些值的循环/查询吗?

sql json sql-server tsql stored-procedures
1个回答
0
投票

您可以尝试创建SQL CLR函数并使用正则表达式来匹配所需的数据。 Here您可以找到什么是SQL CLR集成的详细信息,Mircosoft提供的正则表达式匹配函数的示例以及如何创建此类函数的说明。

因此,通过上述设置,您可以执行以下操作:

DECLARE @data NVARCHAR(MAX) = N'
{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "IncidentName":"Value1",
                    "IncidentName":"Value2",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "IncidentName":"Value3",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            },
        "IncidentName":"Value4"
        }
    }
}';

SELECT *
FROM [dbo].[fn_Utils_RegexMatches] (@data, '(?i)(?<="IncidentName":")[^"]+(?=")');

enter image description here

我正在使用的正则表达式正在执行以下操作:

  • (?i) - 不区分大小写的搜索
  • (?<=“IncidentName”:“) - 搜索此模式,但此模式从最终捕获值中排除(零宽度正向后观断言)
  • [^“] + - 匹配不同形式"的每个字符
  • (?=“) - 使用零宽度正向前瞻断言确保匹配值被"包围

基本上,您可以使用this quick reference来帮助您构建适用于您的案例的正则表达式。

困难的部分是了解SQL CLR是什么以及实现Microsoft的String Utility Pack。然后,您可以解决使用普通T-SQL解决非常困难或无效的问题。

© www.soinside.com 2019 - 2024. All rights reserved.