在 SQL Server 表中,如何根据对具有 JSON 值的列的 JSON 搜索过滤记录

In_Techie

我在过滤 SQL Server 2017 表中的记录时面临挑战,该表有一个 VARCHAR 列,该列具有 JSON 类型值:

具有 JSON 列值的示例表行:

Row # 1. {"Department":["QA"]}   
Row # 2. {"Department":["DEV","QA"]}    
Row # 3. {"Group":["Group 2","Group 12"],"Cluster":[Cluster 11"],"Vertical": 
    ["XYZ"],"Department":["QAT"]}          
Row # 4. {"Group":["Group 20"],"Cluster":[Cluster 11"],"Vertical":["XYZ"],"Department":["QAT"]}

现在我需要根据输入参数从这个表中过滤记录,输入参数可以是以下格式:

要查询的示例 JSON 输入参数:

1. `'{"Department":["QA"]}'` -> This should return Row # 1 as well as Row # 2.   
2. `'{"Group":["Group 2"]}'` -> This should return only Row # 3.

因此,搜索应该类似于如果列值包含“具有任何匹配值的任何可用 json 标记”,然后返回那些匹配的记录。


注意 - 这与 PostgreSQL jsonb 完全相似,如下所示:
PostgreSQL 过滤器子句:

TableName.JSONColumnName @> '{"Department":["QA"]}'::jsonb

通过在互联网上的研究,我发现 SQL Server 中可用的 OPENJSON 功能如下所示。

OPENJSON 示例示例:

SELECT * FROM
tbl_Name UA
CROSS APPLY OPENJSON(UA.JSONColumnTags)
WITH ([Department] NVARCHAR(500) '$.Department', [Market] NVARCHAR(300) '$.Market', [Group] NVARCHAR(300) '$.Group'       
   ) AS OT
WHERE
OT.Department in ('X','Y','Z')
and OT.Market in ('A','B','C')

但这种方法的问题在于,如果将来需要支持 JSON 中的任何新标签(如“区域”),则还需要将其添加到实现此逻辑的每个存储过程中。

是否有我缺少的任何现有 SQL Server 2017 功能或实现相同功能的任何动态方法?

团队 Mylott Tim

在使用 OPENJSON 时,我唯一能想到的一个选项是将您的搜索字符串分解为其键值对,将存储要搜索的 json 的表分解为其键值对并加入。

需要注意以下限制:

  1. 此解决方案不适用于 json 中的嵌套数组
  2. 搜索将是 OR 不是 AND。意思是,如果我传入多个我正在搜索的“部门”,例如 '{"Department":["QA", "DEV"]}',它将返回具有其中一个值的行,而不是那些只包含这两个值的行.

这是一个工作示例:

DECLARE @TestData TABLE
    (
        [TestData] NVARCHAR(MAX)
    );
--Load Test Data
INSERT INTO @TestData (
                          [TestData]
                      )
VALUES ( '{"Department":["QA"]}' )
     , ( '{"Department":["DEV","QA"]}' )
     , ( '{"Group":["Group 2","Group 12"],"Cluster":["Cluster 11"],"Vertical": ["XYZ"],"Department":["QAT"]}' )
     , ( '{"Group":["Group 20"],"Cluster":["Cluster 11"],"Vertical":["XYZ"],"Department":["QAT"]}' );

--Here is the value we are searching for
DECLARE @SeachJson NVARCHAR(MAX) = '{"Department":["QA"]}';

DECLARE @SearchJson TABLE
    (
        [Key] NVARCHAR(MAX)
      , [Value] NVARCHAR(MAX)
    );

--Load the search value into a temp table as its key\value pair.
INSERT INTO @SearchJson (
                            [Key]
                          , [Value]
                        )
            SELECT      [a].[Key]
                      , [b].[Value]
            FROM        OPENJSON(@SeachJson) [a]
            CROSS APPLY OPENJSON([a].[Value]) [b];

--Break down TestData into its key\value pair and then join back to the search table.
SELECT     [TestData].[TestData]
FROM       (
               SELECT      [a].[TestData]
                         , [b].[Key]
                         , [c].[Value]
               FROM        @TestData [a]
               CROSS APPLY OPENJSON([a].[TestData]) [b]
               CROSS APPLY OPENJSON([b].[Value]) [c]
           ) AS [TestData]
INNER JOIN @SearchJson [srch]
    ON [srch].[Key] COLLATE DATABASE_DEFAULT = [TestData].[Key]
       AND [srch].[Value] = [TestData].[Value];

这为您提供以下结果:

TestData
-----------------------------
{"Department":["QA"]}
{"Department":["DEV","QA"]}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用于根据SQL Server中的列值获取具有列的表的SQL查询设计

来自分类Dev

SQL Server 中的 JSON

来自分类Dev

在SQL Server 2012列中查询JSON

来自分类Dev

SQL Server 2014 读取 NVARCHAR 列中保存的数组中的 json 值

来自分类Dev

现有列中的SQL Server 2016 JSON

来自分类Dev

SQL Server在嵌套属性中解析具有特殊字符的json值

来自分类Dev

SQL Server表转json

来自分类Dev

如何在MySQL中搜索具有JSON值的字段?

来自分类Dev

SQL Server:根据TVP表的值删除表中的记录

来自分类Dev

如何根据sql server中的where条件获取表中所有列的值的不同计数?

来自分类Dev

更新/删除 SQL Server 中的 JSON 数组值

来自分类Dev

如何在SQL Server的表列中添加从父JSON读取的JSON值?

来自分类Dev

如何从SQL Server中的EAV表创建JSON

来自分类Dev

如何使用FOR JSON AUTO从SQL SERVER中的变量创建JSON

来自分类Dev

使用 SQL Server 基于列过滤记录

来自分类Dev

如何过滤json列中嵌套值上的行?

来自分类Dev

根据sql server中的值消除记录

来自分类Dev

根据SQL Server中的条件从表中检索列值

来自分类Dev

根据SQL Server中的条件从表中检索列值

来自分类Dev

从 json 插入到 sql server 表 (2016)

来自分类Dev

JSON 对象数据插入 SQL Server 表

来自分类Dev

如何从SQL Server读取JSON数据?

来自分类Dev

如何返回JSON属性(SQL Server)

来自分类Dev

SQL Server 2012中的XML与JSON

来自分类Dev

从SQL Server中的JSON获取密钥名称

来自分类Dev

在SQL Server 2016中遍历JSON

来自分类Dev

在SQL Server中动态更新JSON

来自分类Dev

SQL Server中的json I / O

来自分类Dev

如何使用FOR JSON PATH将具有键/值对的表查询到JSON对象中?

Related 相关文章

热门标签

归档