Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MYSQL trích xuất các phần tử json trong đó json chứa

lib_mysqludf_preg chức năng do người dùng xác định (UDF) đã được sử dụng:

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)

Trong MariaDB, bạn có thể sử dụng hàm tích hợp sẵn REGEXP_REPLACE , xem dbfiddle .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển đổi ngày tháng trong tệp .csv sang định dạng SQL trước khi chèn hàng loạt

  2. Thay đổi cột Bảng Mysql thành phân biệt chữ hoa chữ thường

  3. Cách giải quyết lỗi cập nhật dữ liệu này trong Laravel

  4. Làm thế nào để tạo một TRIGGER trong SEQUELIZE (nodeJS)?

  5. Innodb; nhiều thư mục dữ liệu