如何检查JSON_QUERY返回的数组中是否包含某个字符串

时间:2018-06-11 15:39:16

标签: json tsql sql-server-2016

我尝试编写一个SQL语句,它将解析一些JSON并仅返回JSON对象中的一个数组包含给定值的行。

示例JSON:

Object 1:
{
  "Key1": ["item1", "item2", "item3"]
}

Object 2:
{
  "Key1": ["item1", "item3"]
}

我想只返回JSON_QUERY(object, '$.Key1').Contains("item2")为真的行(在本例中为对象1)。

当然,这个神奇的功能'包含()'在tsql中不存在,我找不到任何像我一样表现的函数文档。

编辑: 我当前的解决方案(我不喜欢并且想要替换)检查字符串文字'"item1"'是否包含在JSON_QUERY返回的值中。我不喜欢这样,因为数组中的条目可能具有类似'123123"item1"123123'的值,然后条件将返回true。

2 个答案:

答案 0 :(得分:0)

基督教,

听起来像我的SQL查询可以在列

上使用LIKE比较使用where子句
WHERE col1 LIKE 'some%funky%string'

%是通配符声明

答案 1 :(得分:0)

您可以使用OPENJSON从json列表或数组中获取派生结果集:

以下查询使用JSON_QUERY检索Key1中的字符串列表。这将作为参数传递到OPENJSON以将字符串列表作为派生表执行:

DECLARE @jsonTable TABLE(ID INT IDENTITY, JsonString NVARCHAR(MAX));
INSERT INTO @jsonTable VALUES
 (N'{
  "Key1": ["item1", "item2", "item3"]
    }')
,(N'{
  "Key1": ["item1", "item3"]
    }');

DECLARE @LookFor NVARCHAR(100)='Item2'

SELECT jt.ID
      ,jt.JsonString
      ,A.value
FROM @jsonTable jt
OUTER APPLY OPENJSON(JSON_QUERY(jt.JsonString,N'$.Key1')) AS A
--WHERE A.value=@LookFor

取消注释最终WHERE以将列表缩减为值Item2的行(如变量@LookFor中所定义)。