我尝试编写一个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。
答案 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
中所定义)。