MySQL - JSON_CONTAINS不能使用引号或逗号分隔的字符串在数组上工作吗?

时间:2017-06-27 14:49:39

标签: mysql arrays json

我有一个带有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'))

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

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

我已经解决了这个问题。

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

ApplicationSchema

你可以这样做

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

'u' 将返回 1。

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