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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server:从包含json字符串的nvarchar(max)变量中获取所有字符串出现(标记)相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

您可以尝试创建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解决非常困难或无效的问题。

以上是关于SQL Server:从包含json字符串的nvarchar(max)变量中获取所有字符串出现(标记)的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中读取 JSON 数据时无法从字符串转换为日期时间

从包含十进制 SQL Server 18 的字符串字段中提取数字

如何从 SQL Server 中的动态节点加载 OPENJSON

在 iOS、PHP 和 JSON 中使用来自 SQL Server 的空值

SQL Server:查询应用在 where 子句中,包含 Json 对象的列上的 IS NOT Null 需要更多时间

无法在包含 NULL 值的 SQL 表中创建 JSON 格式的列