【问题标题】:how to perform a SELECT on a JSON column in mysql/mariaDB如何在 mysql/mariaDB 中的 JSON 列上执行 SELECT
【发布时间】:2018-07-26 01:21:58
【问题描述】:

如何在 JSON 列上应用 WHERE 子句以对具有两列(id Integer、attr JSON)的表执行 SELECT 查询。 JSON是嵌套的,在过滤条件下只允许一个json键值对。这个键值对可以在 Josn 中的任何位置。

+----+-----------------------------------------------------------------
| id | attr                                                                                          
|
+----+-----------------------------------------------------------------
|  1 | {"id":"0001","type":"donut","name":"Cake","ppu":0.55}                                         
|
|  2 | {"id":"0002","type":"donut","name":"Cake","ppu":0.55,"batters":
       {"batter1":100,"batter2":200}} 
+----+-----------------------------------------------------------------

【问题讨论】:

  • 您可以发布一些数据,或者您尝试过的查询吗?
  • @TimBiegeleisen 我应该能够过滤 Json 列。 FYU (select id from table_name where attr contains "batter2":200")

标签: mysql mariadb mysql-python


【解决方案1】:

在 MariaDB 10.2 中,您可以使用 JSON functions

例如,如果您想从数据库中选择所有甜甜圈,您可以:

SELECT * FROM t WHERE JSON_CONTAINS(attr, '"donut"', '$.type');

注意:在 MariaDB 中,JSON 函数适用于所有文本数据类型(VARCHAR、TEXT 等)。 JSON 类型只是 LONGTEXT 的别名。

【讨论】:

  • MySQL 5.7 有一些 JSON 函数。
【解决方案2】:

类似于markusjm's answer,你可以直接从json by field中选择:

SELECT json_extract(attr, '$.type') FROM t;

【讨论】:

    【解决方案3】:

    如果您仍在使用 MySQL 5.6(不支持 JSON 解析),我们可以使用 substring_index 函数来解析 json 数据。

    这是一个工作示例:

    CREATE TABLE `products` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `attr` longtext COLLATE utf8_unicode_ci NOT NULL,
      `created_at` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    INSERT INTO products (attr, created_at) 
    VALUES 
    ('{"id":"0001","type":"donut","name":"Cake","ppu":0.55}', now()),
    ('{"id":"0002","type":"donut","name":"Cake","ppu":0.55,"batters":{"batter1":100,"batter2":200}}', now()),
    ('{"id":"0003","type":"apple","name":"Apple","ppu":0.60}', now()),
    ('{"id":"0003","type":"orange","name":"Orange","ppu":0.65}', now());
    
    select 
        substring_index(substring_index(attr, '"type":"', -1), '",', 1) AS product_type
    from products
    having product_type = 'donut';
    

    【讨论】:

      猜你喜欢
      • 2014-08-08
      • 2022-01-06
      • 2018-08-03
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      相关资源
      最近更新 更多