是否可以对 JSON 数组进行“IN”查询?
Is is possible to do `IN` query over JSON array?
在 SQL 服务器中,有没有办法对 json 数组进行 IN
查询?
例如
有一列 foo
包含一个 json 数组
第 1 行 -> {"foo":["a", "b"]}
第 2 行 -> {"foo":["c", "a", "b"]}
我需要查询 json 数组
中具有 b
的行
JSON_QUERY
可以return数组,但是没办法
类似
SELECT *
FROM table1
WHERE "b" in JSON_QUERY(foo)
LIKE
查询可以,但效率低下
您可以将 OPENJSON
与 JSON_QUERY
结合使用 CROSS APPLY
将结果分解为数组元素级别
declare @tmp table (foo nvarchar(max))
insert into @tmp values
('{"foo":["a", "b"]}')
,('{"foo":["c", "a", "b"]}')
,('{"foo":["c", "a", "y"]}')
SELECT foo
FROM @tmp AS c
CROSS APPLY OPENJSON(JSON_QUERY(foo, '$.foo')) AS x
where x.[value]='b'
示例输入:
示例输出:
在 SQL 服务器中,有没有办法对 json 数组进行 IN
查询?
例如
有一列 foo
包含一个 json 数组
第 1 行 -> {"foo":["a", "b"]}
第 2 行 -> {"foo":["c", "a", "b"]}
我需要查询 json 数组
中具有b
的行
JSON_QUERY
可以return数组,但是没办法
类似
SELECT *
FROM table1
WHERE "b" in JSON_QUERY(foo)
LIKE
查询可以,但效率低下
您可以将 OPENJSON
与 JSON_QUERY
结合使用 CROSS APPLY
将结果分解为数组元素级别
declare @tmp table (foo nvarchar(max))
insert into @tmp values
('{"foo":["a", "b"]}')
,('{"foo":["c", "a", "b"]}')
,('{"foo":["c", "a", "y"]}')
SELECT foo
FROM @tmp AS c
CROSS APPLY OPENJSON(JSON_QUERY(foo, '$.foo')) AS x
where x.[value]='b'
示例输入:
示例输出: