【发布时间】: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'))
现在我只需要在数组值有双引号时加入一些帮助。
【问题讨论】: