mysql - JSON_EXTRACT 函数上的索引不返回数据

标签 mysql json

我的问题是,当我尝试使用 mysql 函数 JSON_EXTRACT 获取数据时,问题是我使用索引 [0] 进行操作,一切正常,但是当我请求下一个 [1] 时,返回 null。我尝试过没有索引来了解搜索如何返回我的所有 json 数据,当我尝试获取超过 0 位置的索引位置时,不返回任何数据,只返回 null。这是我的示例代码:

set @example = '{"product":{
                            "id_product":1, 
                            "quantity":1
                           },
                 "product":{
                            "id_product":3, 
                            "quantity":4
                            },
                 "product":{
                            "id_product":5, 
                            "quantity":2
                            }
                 }';

select JSON_EXTRACT(@example, '$.product[0].id_product'); -- Returns '1'
select JSON_EXTRACT(@example, '$.product[1].id_product'); -- Returns null, should be '3'

我想知道如果不是真的像这样使用的话到底是如何工作的。
提前致谢。

最佳答案

最后一个重复键获胜

11.6 The JSON Data Type :: Normalization, Merging, and Autowrapping of JSON Values

...

This "last duplicate key wins" behavior is suggested by RFC 7159 and is implemented by most JavaScript parsers.

...

In versions of MySQL prior to 8.0.3, members with keys that duplicated a key found earlier in the document were discarded.

...

示例:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.15    |
+-----------+
1 row in set (0.00 sec)

mysql> SET @`example` := '{
    '>   "product": {
    '>     "id_product": 1,
    '>     "quantity": 1
    '>   },
    '>   "product": {
    '>     "id_product": 3,
    '>     "quantity": 4
    '>   },
    '>   "product": {
    '>     "id_product": 5,
    '>     "quantity": 2
    '>   }
    '> }';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT JSON_VALID(@`example`);
+------------------------+
| JSON_VALID(@`example`) |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.01 sec)

mysql> SELECT JSON_LENGTH(@`example`);
+-------------------------+
| JSON_LENGTH(@`example`) |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_EXTRACT(@`example`, '$.product');
+---------------------------------------+
| JSON_EXTRACT(@`example`, '$.product') |
+---------------------------------------+
| {"quantity": 2, "id_product": 5}      |
+---------------------------------------+
1 row in set (0.00 sec)

一些选项

选项 0:

mysql> SET @`example` := '{
    '>   "product_0": {
    '>     "id_product": 1,
    '>     "quantity": 1
    '>   },
    '>   "product_1": {
    '>     "id_product": 3,
    '>     "quantity": 4
    '>   },
    '>   "product_2": {
    '>     "id_product": 5,
    '>     "quantity": 2
    '>   }
    '> }';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT JSON_VALID(@`example`);
+------------------------+
| JSON_VALID(@`example`) |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_LENGTH(@`example`);
+-------------------------+
| JSON_LENGTH(@`example`) |
+-------------------------+
|                       3 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT
    ->   JSON_EXTRACT(@`example`, '$.product_0.id_product'),
    ->   JSON_EXTRACT(@`example`, '$.product_1.id_product'),
    ->   JSON_EXTRACT(@`example`, '$.product_2.id_product')\G
*************************** 1. row ***************************
JSON_EXTRACT(@`example`, '$.product_0.id_product'): 1
JSON_EXTRACT(@`example`, '$.product_1.id_product'): 3
JSON_EXTRACT(@`example`, '$.product_2.id_product'): 5
1 row in set (0.00 sec)

选项 1:

mysql> SET @`example` := '[
    '> {
    '>   "product": {
    '>     "id_product": 1,
    '>     "quantity": 1
    '>   }
    '> },
    '> {
    '>   "product": {
    '>     "id_product": 3,
    '>     "quantity": 4
    '>   }
    '> },
    '> {
    '>   "product": {
    '>     "id_product": 5,
    '>     "quantity": 2
    '>   }
    '> }]';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT JSON_VALID(@`example`);
+------------------------+
| JSON_VALID(@`example`) |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_LENGTH(@`example`);
+-------------------------+
| JSON_LENGTH(@`example`) |
+-------------------------+
|                       3 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT
    ->   JSON_EXTRACT(@`example`, '$[0].product.id_product'),
    ->   JSON_EXTRACT(@`example`, '$[1].product.id_product'),
    ->   JSON_EXTRACT(@`example`, '$[2].product.id_product')\G
*************************** 1. row ***************************
JSON_EXTRACT(@`example`, '$[0].product.id_product'): 1
JSON_EXTRACT(@`example`, '$[1].product.id_product'): 3
JSON_EXTRACT(@`example`, '$[2].product.id_product'): 5
1 row in set (0.00 sec)

关于mysql - JSON_EXTRACT 函数上的索引不返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55691338/

相关文章:

mysql - 为 Azure 上托管的免费 MySQL 数据库创建新用户(root 访问权限)

mysql - docker mysql容器启动后退出

javascript - 提取现有 javascript 文件中数组的值

javascript - 如何在不获取空对象的情况下进行 JSON.stringify 和 JSON.parse?

javascript - 解析带键 JSON 对象的最佳方法

python - Django:访问模板中的列表属性

php - 使用PHP和MySQL计算地理定位距离

php - Laravel - 更新内容错误 Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException

c# - 如何在 C# 中生成 JavaScript 对象字面量?

python - JSON 文件到 Pandas df