我正在尝试选择列中的roles属性json包含任何值的所有列。
我试过的语句:
SELECT * FROM components WHERE json->'$.roles' IN(1)
SELECT * FROM components WHERE JSON_CONTAINS(components, '1', '$.roles')
1它时,它会像它应该的那样拉两个,因为它们都包含 1,但是如果我插入1,2或者JSON_ARRAY(1,2)它只会拉后面的行,因为它没有检查每个数组元素......我有以下表components 结构和数据:
+====+========================================================================================================================================================================================================+==+
| id | json | |
+====+========================================================================================================================================================================================================+==+
| 1 | {"area": 1, "roles": [1], "elements": [{"home": {"content": "Home", "attributes": {"class": "my_class_1"}}}, {"dashboard": {"content": "Dashboard", "attributes": {"class": "my_class_1"}}}]} | |
+----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--+
| 2 | {"area": 1, "roles": [1, 2, 5], "elements": [{"home": {"content": "Testing", "attributes": {"class": "my_class_1"}}}, {"dashboard": {"content": "Dashboard", "attributes": {"class": "my_class_1"}}}]} | |
+----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--+
Run Code Online (Sandbox Code Playgroud)
问题:如何修改这些语句中的任何一个以允许它们根据roles属性中的值查询行?
Ale*_*sov 12
请参阅https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#function_json-overlaps
JSON_OVERLAPS(json_doc1, json_doc2)
比较两个 JSON 文档。如果两个文档具有任何共同的键值对或数组元素,则返回 true (1)。如果两个参数都是标量,则该函数执行简单的相等测试。
此函数与 相对应JSON_CONTAINS(),后者要求搜索到的数组中的所有元素都存在于搜索到的数组中。因此,JSON_CONTAINS()对搜索键执行 AND 运算,同时JSON_OVERLAPS()执行 OR 运算。
JSON_OVERLAPS()可以使用多值索引来优化 WHERE 子句中使用的 InnoDB 表 JSON 列的查询。多值索引,提供详细信息和示例。
比较两个数组时,JSON_OVERLAPS()如果它们共享一个或多个数组元素,则返回 true,否则返回 false。
mysql> SELECT JSON_OVERLAPS("[1,3,5,7]", "[2,5,7]");
+---------------------------------------+
| JSON_OVERLAPS("[1,3,5,7]", "[2,5,7]") |
+---------------------------------------+
| 1 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_OVERLAPS("[1,3,5,7]", "[2,6,7]");
+---------------------------------------+
| JSON_OVERLAPS("[1,3,5,7]", "[2,6,7]") |
+---------------------------------------+
| 1 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_OVERLAPS("[1,3,5,7]", "[2,6,8]");
+---------------------------------------+
| JSON_OVERLAPS("[1,3,5,7]", "[2,6,8]") |
+---------------------------------------+
| 0 |
+---------------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
表达方式
value in (x, y, z, ...)
Run Code Online (Sandbox Code Playgroud)
相当于
value = x OR value = y OR value = z OR ...
Run Code Online (Sandbox Code Playgroud)
这对数组不起作用,json->'$.roles'因为数组不等于其元素,您需要调用JSON_CONTAINS()来测试它。
对于你想要的,你需要调用JSON_CONTAINS()你想要测试的每个值。
WHERE JSON_CONTAINS(components, '1', '$.roles') OR JSON_CONTAINS(components, '2', '$.roles')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11318 次 |
| 最近记录: |