繁体   English   中英

MYSQL提取json包含的json元素

[英]MYSQL extract json elements where the json contains

我有桌上的ordersorders items作为JSON

orders示例。 items单元格:



    {
    "10": {
        "name": "item 1",
        "step": "1",
        "price": "140",
        "amount": "4",
        "category": "9"
    },
    "24": {
        "name": "item 2",
        "step": "1",
        "price": "6.2",
        "amount": "1",
        "category": "5"
    },
    "35": {
        "name": "item 3",
        "step": "1",
        "price": "2.9",
        "amount": "3",
        "category": "1"
    },
    "37": {
        "name": "item 4",
        "step": "1",
        "price": "3.9",
        "amount": "2",
        "category": "9"
    }
    }

我只想提取特定类别的项目

仅提取类别为“ 9”的项目的预期结果:



    {
    "10": {
        "name": "item 1",
        "step": "1",
        "price": "140",
        "amount": "4",
        "category": "9"
    },
    "37": {
        "name": "item 4",
        "step": "1",
        "price": "3.9",
        "amount": "2",
        "category": "9"
    }
    }

到目前为止,我已设法得到所有orders items单元格,其中类别=“ 9”的项目


SELECT
  `id`,
  JSON_EXTRACT(`orders`.`items`,
  '$')
FROM
  `orders`
WHERE
  JSON_CONTAINS(
    JSON_EXTRACT(`orders`.`items`,
    '$.*.category'),
    '"9"'
  )

使用了lib_mysqludf_preg用户定义函数(UDF):

mysql> DROP TABLE IF EXISTS `orders`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `orders` (
    ->   `id` SERIAL,
    ->   `items` JSON
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `orders`
    ->   (`items`)
    -> VALUES ('
    '>   {
    '>     "10": {
    '>       "name": "item 1",
    '>       "step": "1",
    '>       "price": "140",
    '>       "amount": "4",
    '>       "category": "9"
    '>     },
    '>     "24": {
    '>       "name": "item 2",
    '>       "step": "1",
    '>       "price": "6.2",
    '>       "amount": "1",
    '>       "category": "5"
    '>     },
    '>     "35": {
    '>       "name": "item 3",
    '>       "step": "1",
    '>       "price": "2.9",
    '>       "amount": "3",
    '>       "category": "1"
    '>     },
    '>     "37": {
    '>       "name": "item 4",
    '>       "step": "1",
    '>       "price": "3.9",
    '>       "amount": "2",
    '>       "category": "9"
    '>     }
    '>   }'),
    ->   ('{
    '>     "10": {
    '>       "name": "item 1",
    '>       "step": "1",
    '>       "price": "141",
    '>       "amount": "4",
    '>       "category": "9"
    '>     }
    '>   }'),
    ->   ('{
    '>     "10": {
    '>       "name": "item 1",
    '>       "step": "1",
    '>       "price": "141",
    '>       "amount": "4",
    '>       "category": "8"
    '>     }
    '>   }');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT `id`, `items`
    -> FROM `orders`;
+----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | items                                                                                                                                                                                                                                                                                                                                                        |
+----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  1 | {"10": {"name": "item 1", "step": "1", "price": "140", "amount": "4", "category": "9"}, "24": {"name": "item 2", "step": "1", "price": "6.2", "amount": "1", "category": "5"}, "35": {"name": "item 3", "step": "1", "price": "2.9", "amount": "3", "category": "1"}, "37": {"name": "item 4", "step": "1", "price": "3.9", "amount": "2", "category": "9"}} |
|  2 | {"10": {"name": "item 1", "step": "1", "price": "141", "amount": "4", "category": "9"}}                                                                                                                                                                                                                                                                      |
|  3 | {"10": {"name": "item 1", "step": "1", "price": "141", "amount": "4", "category": "8"}}                                                                                                                                                                                                                                                                      |
+----+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)

mysql> SET @`category` := '9';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT
    -> GROUP_CONCAT('
    '>   SELECT
    '>     `id`,
    '>     JSON_EXTRACT(CONCAT(\'[\', REPLACE(`items`, \'"}, "\', \'"}},{"\'), \']\'), ',
    ->       PREG_REPLACE('/^\\[|\\.\\\\\"\\d+\\\\\"\\.category|\\]$/i', '', 
    ->         JSON_SEARCH(
    ->           CONCAT('[', REPLACE(`items`, '"}, "', '"}},{"'), ']'),
    ->           'all',
    ->           @`category`,
    ->           NULL,
    ->           '$**.category'
    ->         )
    ->       ), '
    '>     ) `items`
    '>   FROM `orders`
    '>   WHERE `id` = ', `id`
    ->   SEPARATOR ' UNION ALL ') INTO @`sql`
    -> FROM
    ->   `orders`
    -> WHERE
    ->   JSON_CONTAINS(
    ->     JSON_EXTRACT(`items`,
    ->     '$**.category'),
    ->     CONCAT('"', @`category`, '"')
    ->   );
Query OK, 1 row affected (0.00 sec)

mysql> PREPARE `stmt` FROM @`sql`;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> EXECUTE `stmt`;
+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | items                                                                                                                                                                              |
+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|  1 | [{"10": {"name": "item 1", "step": "1", "price": "140", "amount": "4", "category": "9"}}, {"37": {"name": "item 4", "step": "1", "price": "3.9", "amount": "2", "category": "9"}}] |
|  2 | {"10": {"name": "item 1", "step": "1", "price": "141", "amount": "4", "category": "9"}}                                                                                            |
+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> DEALLOCATE PREPARE `stmt`;
Query OK, 0 rows affected (0.00 sec)

在MariaDB中,您可以使用内置函数REGEXP_REPLACE ,请参见dbfiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM