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

时间:2019-04-15 14:23:58

标签: 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'

我想知道如果不是真的这样使用的话。
 预先感谢。

1 个答案:

答案 0 :(得分:0)

最后一次重复赢得密钥

  

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

     

...

     

RFC 7159建议这种“最后的重复密钥获胜”行为,并且大多数JavaScript都实现了这种行为。   解析器。

     

...

     

在8.0.3之前的MySQL版本中,具有与文档较早版本中的键重复的键的成员将被丢弃。

     

...

示例:

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)