如何搜索包含 JSON 数组的 SQL 列

Posted

技术标签:

【中文标题】如何搜索包含 JSON 数组的 SQL 列【英文标题】:How to search SQL column containing JSON array 【发布时间】:2018-04-24 15:40:55 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

要在 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'

【讨论】:

SQL Server 参考:docs.microsoft.com/en-us/sql/t-sql/functions/…【参考方案2】:

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

SELECT * FROM  table
where  JSON_CONTAINS(column, 'joe','$.name');

【讨论】:

mysql 参考:dev.mysql.com/doc/refman/5.7/en/json-search-functions.html 这只适用于 MySQL,问题是关于 SQL 2016。【参考方案3】:

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%';

【讨论】:

你拯救了我的夜晚!非常感谢。【参考方案4】:

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

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

将 TABLE 替换为您的表名,将 COLUMN 替换为表中的列名。 我在你的问题中提到的名字。

【讨论】:

以上是关于如何搜索包含 JSON 数组的 SQL 列的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel的json数组列中找到字符串搜索的位置

SQL 如何从单个列中的所有值创建 JSON 数组

MySQL - 搜索 JSON 数据列

如何使用 Eloquent 在包含对象数组的 json 字段中进行搜索

当列是 JSON 数组而不是字符串时如何过滤 ANTD 表

如何将包含数组的 JSON 表迁移到 SQL?