JSON_CONTAINS() 与 MySQL 中的 JSON 对象数组

Posted

技术标签:

【中文标题】JSON_CONTAINS() 与 MySQL 中的 JSON 对象数组【英文标题】:JSON_CONTAINS() with an array of JSON objects in MySQL 【发布时间】:2021-03-07 07:58:11 【问题描述】:

这是一个示例数据库“test”,其中包含 JSON 对象数组的 JSON 列“arr”

+----+----------------------------------------------------------+
| id | arr                                                      |
+----+----------------------------------------------------------+
|  1 | ["name": "aman", "name": "jay"]                      |
|  2 | ["name": "yash", "name": "aman", "name": "jay"] |
+----+----------------------------------------------------------+

我想使用 JSON_CONTAINS 来了解数组中某个对象的特定键中是否存在值。

这是我的查询:

SELECT JSON_CONTAINS(arr, '"jay"', '$[*].name') from test WHERE id=1;

我收到以下错误:

ERROR 3149 (42000):在这种情况下,路径表达式可能不包含 * 和 ** 标记或数组范围。

我知道我可以尝试为此使用JSON_EXTRACT(),但是我在这里做错了什么?

有没有办法在 mysql 中使用JSON_CONTAINS 和 JSON 对象数组。

【问题讨论】:

【参考方案1】:

您必须使用 JSON_SEARCH:

SELECT JSON_SEARCH(arr, 'one', 'jay', NULL, '$[*].name') IS NOT NULL
FROM test 
WHERE id=1;

【讨论】:

【参考方案2】:

是的,可以使用以下语法:

SELECT JSON_CONTAINS(arr, '"name": "jay"') from test WHERE id=1;

db<>fiddle demo

例子:

+-----+--------------------------------------------------------+---+
| id  |                          arr                           | r |
+-----+--------------------------------------------------------+---+
|  1  | ["name": "aman", "name": "jay"]                    | 1 |
|  2  | ["name": "yash", "name": "aman", "name": "jay"]  | 1 |
|  3  | ["name": "yash", "name": "aman"]                   | 0 |
+-----+--------------------------------------------------------+---+

【讨论】:

以上是关于JSON_CONTAINS() 与 MySQL 中的 JSON 对象数组的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 过滤 JSON_CONTAINS 数组中的任何值

MySQL JSON - 使用 IN 语句 | json_contains

mysql中json_contains和json_search的区别

使用 MariaDB 在 JSON_CONTAINS() 中未考虑德语变音符号

如何限制 JSON_CONTAINS 只返回正值?

Mysql Json函数之搜索