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":")[^"]+(?=")');
我正在使用的正则表达式正在执行以下操作:
- (?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 需要更多时间