1

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

示例 JSON:

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

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

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

当然,tsql 中不存在这个神奇的函数 'Contains()',而且我找不到任何可以按照我的意愿执行的函数的文档。

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

4

2 回答 2

0

基督教,

在我看来,您的 SQL 查询可以使用 where 子句,在列上使用 LIKE 比较

WHERE col1 LIKE 'some%funky%string'

% 是通配符声明

于 2018-06-11T16:13:25.550 回答
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

取消注释 finalWHERE以将列表缩减为值为Item2(在变量中定义的@LookFor)的行。

于 2018-06-12T11:04:21.413 回答