提问人:littleAlien 提问时间:11/11/2023 最后编辑:Gagan ShrivastavalittleAlien 更新时间:11/16/2023 访问量:39
MySQL,JSON_CONTAINS在数组上的使用
MySQL, JSON_CONTAINS usage on array
问:
如何在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.
答:
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中没有索引,就像使用纯文本一样)
评论
SELECT VERSION();