【问题标题】:MySQL - JSON_CONTAINS not working on array with quotes or comma separated string?MySQL - JSON_CONTAINS 不能处理带有引号或逗号分隔字符串的数组?
【发布时间】:2017-06-27 14:49:38
【问题描述】:

我有一个带有 json 列的表,我在其中存储了合同类型的 id 列表。我想在contract_types 表上进行连接,这样我就可以获得他们的 id 的合同类型名称的串联列表。

CREATE TABLE `my_alerts` (
   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
   `name` VARCHAR(255) NOT NULL,
   `criteria` JSON NULL DEFAULT NULL,
   PRIMARY KEY (`id`)
)


CREATE TABLE `contract_types` (
   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
   `name` VARCHAR(255) NOT NULL,
   PRIMARY KEY (`id`)
)

INSERT INTO contract_types (id, name) VALUES (1, 'Full time');
INSERT INTO contract_types (id, name) VALUES (2, 'Part time');

INSERT INTO my_alerts (id, name, criteria) VALUES (1, 'test', '{"contractTypes": ["1", "2"]}');

我尝试了以下查询,但它不起作用:

SELECT 
   a.id, 
   a.name, 
   GROUP_CONCAT(c.name SEPARATOR ', ') as contractTypes
FROM my_alerts a
LEFT JOIN contract_types c on JSON_CONTAINS(a.criteria, CAST(c.id as JSON), '$.contractTypes')
group by a.id

如果我更改 json 列并存储不带引号的数组值,我只能使查询工作:

{"contractTypes": [1, 2]}

不幸的是,我无法更改数组值的存储方式,即不带引号。

当 json 数组值以以下两种格式存储时,如何使上述 json_contains 查询工作:

{"contractTypes": ["1", "2"]}

{"contractTypes": ["1,2"]}

* 更新 *

如果 json 是第二种格式,即逗号分隔的列表,我已经弄清楚了如何加入,如下所示:

LEFT JOIN contract_types c on find_in_set(c.id, JSON_EXTRACT(a.criteria, '$.contractTypes'))

现在我只需要在数组值有双引号时加入一些帮助。

【问题讨论】:

    标签: mysql arrays json


    【解决方案1】:

    尝试并调​​整您需要的内容:

    mysql> SELECT
        ->   CAST(JSON_ARRAY(GROUP_CONCAT(`id` SEPARATOR ', ')) AS JSON)
        -> FROM `contract_types`;
    +-------------------------------------------------------------+
    | CAST(JSON_ARRAY(GROUP_CONCAT(`id` SEPARATOR ', ')) AS JSON) |
    +-------------------------------------------------------------+
    | ["1, 2"]                                                    |
    +-------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT
        ->   CAST(REPLACE(GROUP_CONCAT(JSON_ARRAY(CAST(`id` AS CHAR))), '],[', ', ') AS JSON)
        -> FROM `contract_types`;
    +----------------------------------------------------------------------------------+
    | CAST(REPLACE(GROUP_CONCAT(JSON_ARRAY(CAST(`id` AS CHAR))), '],[', ', ') AS JSON) |
    +----------------------------------------------------------------------------------+
    | ["1", "2"]                                                                       |
    +----------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

    【讨论】:

      【解决方案2】:

      我已经解决了这个问题。

      如果您的 json 列名为“user_ids”并且它具有如下值:

      ["1", "2", "3", "4", "5"] 
      

      你可以这样做

      SELECT JSON_CONTAINS(user_ids, '"2"', '$') as u;
      

      'u' 将返回 1。

      此解决方案的关键是确保先用双引号将数字括起来,然后再用单引号括起来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多