21

我有一个包含单个 JSON 数组的 SQL 列:

{"names":["Joe","Fred","Sue"]}

给定一个搜索字符串,如何使用 SQL 在名称数组中搜索匹配项?我正在使用 SQL 2016 并查看了 JSON_QUERY,但不知道如何在 JSON 数组上搜索匹配项。像下面这样的东西会很好。

SELECT *
FROM table
WHERE JSON_QUERY(column, '$.names') = 'Joe'
4

4 回答 4

41

为了在 JSON 数组中进行搜索,需要使用OPENJSON

DECLARE @table TABLE (Col NVARCHAR(MAX))
INSERT INTO @table VALUES ('{"names":["Joe","Fred","Sue"]}')

SELECT * FROM @table 
WHERE 'Joe' IN ( SELECT value FROM OPENJSON(Col,'$.names'))  

或者作为替代方案,可以将其与CROSS APPLY.

SELECT * FROM 
    @table 
    CROSS APPLY OPENJSON(Col,'$.names')
WHERE value ='Joe'
于 2017-11-11T15:05:45.440 回答
1

这非常简单,可以使用 JSON_CONTAINS() 函数轻松完成。

SELECT * FROM  table
where  JSON_CONTAINS(column, 'joe','$.name');
于 2020-06-24T01:38:34.547 回答
0

Postgres 语法

当您知道保存数据的密钥时:

SELECT column_name from table_name where column_name->>'key' LIKE '%QUERYSTRING%';

当您不知道保存数据的密钥时:

SELECT column_name from table_name where column_name::text LIKE '%QUERYSTRING%';

于 2021-06-03T05:17:36.613 回答
0

您可以通过以下查询在 JSON 数组上搜索匹配项:

SELECT JSON_EXTRACT(COLUMN, "$.names") AS NAME
FROM TABLE JSON_EXTRACT(COLUMN, "$.names") != ""

将 TABLE 替换为您的表名,将 COLUMN 替换为表中的列名。我提到的关键名称,因为它在你的问题中。

于 2021-06-08T08:27:18.950 回答