MySQL,JSON_CONTAINS在数组上的使用

MySQL, JSON_CONTAINS usage on array

提问人:littleAlien 提问时间:11/11/2023 最后编辑:Gagan ShrivastavalittleAlien 更新时间:11/16/2023 访问量:39

问:

如何在MySQL字段中使用这种结构的“JSON_CONTAINS”? 这样做:JSON[{"uuid": "a07b50ca-42f0-4d2b-b0a2-f2980deb03d8"}]

SELECT * from tables c where 
    JSON_CONTAINS(c.data, '64a3104c-01e6-417b-8a11-bf5af73ad87d', '$[*].uuid') 

但是出现错误

Invalid JSON text in argument 1 to function json_contains: 
"The document root must not be followed by other values." at position 2.
数组 mysql-json

评论

0赞 Bill Karwin 11/11/2023
您的实例会返回什么?也就是说,您使用的是哪个版本的 MySQL?SELECT VERSION();
0赞 littleAlien 11/11/2023
@BillKarwin 8.0.27-18
0赞 littleAlien 11/11/2023
@BillKarwin这个问题没有答案......不能采用任何这些方法,除了“JSON_CONTAINS”之外不需要其他方法
0赞 littleAlien 11/11/2023
@Luuk不,它不是按数组搜索

答:

1赞 Bill Karwin 11/11/2023 #1

JSON_CONTAINS() 的文档说:

如果目标或候选项不是有效的 JSON 文档,或者 path 参数不是有效的路径表达式或包含 * 或 ** 通配符,则会发生错误。

这意味着你不能使用 JSON_CONTAINS(),除非你在特定路径上搜索一个值。

此外,第二个参数必须是 JSON 文档,而不是字符串。

mysql> SELECT * from tables c where
       JSON_CONTAINS(c.data, '"a07b50ca-42f0-4d2b-b0a2-f2980deb03d8"', '$[0].uuid');
+----+----------------------------------------------------+
| id | data                                               |
+----+----------------------------------------------------+
|  1 | [{"uuid": "a07b50ca-42f0-4d2b-b0a2-f2980deb03d8"}] |
+----+----------------------------------------------------+

这有效,但只是因为我将值设置为 JSON 字符串(用双引号括起来),并且我在数组中搜索了一个固定位置。

我假设您想在数组中的任何位置搜索该值,而不仅仅是.'$[0]'

MySQL中的解决方案是使用JSON_TABLE(),这样你就可以将数组映射到行中,然后使用WHERE条件。

mysql> SELECT * FROM tables c CROSS JOIN JSON_TABLE(c.data, '$[*]' COLUMNS (uuid CHAR(36) PATH '$.uuid')) AS j WHERE j.uuid = 'a07b50ca-42f0-4d2b-b0a2-f2980deb03d8';
+----+----------------------------------------------------+--------------------------------------+
| id | data                                               | uuid                                 |
+----+----------------------------------------------------+--------------------------------------+
|  1 | [{"uuid": "a07b50ca-42f0-4d2b-b0a2-f2980deb03d8"}] | a07b50ca-42f0-4d2b-b0a2-f2980deb03d8 |
+----+----------------------------------------------------+--------------------------------------+

如果你发现JSON实现JSON的方式不符合你的需求,那么我建议将数据存储在普通的行和列中。你评论了我的另一个答案,这会导致额外的连接,但这是 SQL 的正常部分。这就像说你不想在 Java 中使用 for 循环。

评论

0赞 littleAlien 11/11/2023
谢谢,棘手的部分是同时使用双引号和“[0]”。我从另一个主题中想到 [0] 只会按第一个数组元素进行搜索......关于联接 - 是的,对于忽略代码复杂性和性能影响的解决方案,它们是可以接受的。然而,在现实世界中,这些因素需要在某个时候考虑。在项目的其他部分,我确实使用连接)无论如何,我很感激你的魔法咒语:)
1赞 Bill Karwin 11/11/2023
'$[0]'只搜索数组中的第一个元素。如果要在数组的任何元素的特定键中搜索值,请使用我展示的 JSON_TABLE() 解决方案。
0赞 littleAlien 11/12/2023
嗯。最后我明白了,我不想相信和阅读我期望找到的东西)唯一的方法是提取为一列)再次感谢)
0赞 Bill Karwin 11/12/2023
要成为一名有效的软件开发人员,您必须抵制确认偏见。了解事物是如何运作的,而不是你希望它们如何运作。
0赞 littleAlien 11/12/2023
我放弃了有效。社会关系获胜,而不是有效性。现在我不喜欢mysql中的json)反正json中没有索引,就像使用纯文本一样)