将所有JSON列转换为新表

时间:2018-08-21 01:02:12

标签: mysql sql json json-query

我目前的表格结构如下:

customer_id  name   phoneNumbers  
1            Adam   [{'type':'home','number':'687-5309'} , {'type':'cell','number':'123-4567'}] 
2            Bill   [{'type':'home','number':'987-6543'}] 

将phoneNumbers列设置为JSON列类型。 为简单起见,尽管我希望将所有JSON电话号码隐藏到一个新的单独表中。 像这样:

phone_id  customer_id type    number
1         1           home    687-5309  
2         1           cell    123-4567
3         2           home    987-6543

似乎它应该可以与OPENJSON一起使用,但是到目前为止,我还没有找到确定如何正确声明它的运气。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

使用具有1的递归CTE并递归到json_length。

SELECT c.*, JSON_LENGTH(c.phoneNumbers) as json_length
from customers c;

然后使用concat在Extract Query中传递那个element_id:

(json_unquote(JSON_EXTRACT(phoneNumbers, CONCAT('$.type.',1))), json_unquote(JSON_EXTRACT(phoneNumbers, CONCAT('$.number.',1))))
(json_unquote(JSON_EXTRACT(phoneNumbers, CONCAT('$.type.',2))), json_unquote(JSON_EXTRACT(phoneNumbers, CONCAT('$.number.',1))))
-
-
-
(json_unquote(JSON_EXTRACT(phoneNumbers, CONCAT('$.type.',json_length))), json_unquote(JSON_EXTRACT(phoneNumbers, CONCAT('$.number.',json_length))))

答案 1 :(得分:1)

您可以执行以下操作:

SELECT id,
    name,
    JSON_UNQUOTE(JSON_EXTRACT(phone, CONCAT("$[", seq.i, "]", ".", "number"))) AS NUMBER, 
    JSON_UNQUOTE(JSON_EXTRACT(phone, CONCAT("$[", seq.i, "]", ".", "type"))) AS TYPE
FROM customer, (SELECT 0 AS I UNION ALL SELECT 1) AS seq
WHERE seq.i < json_length(phone)

诀窍是(SELECT 0 as i union all SELECT 1),取决于您可能需要添加更多索引的JSON数组的长度。您可以通过以下方式找出最大长度:

SELECT MAX(JSON_LENGTH(phone)) FROM customer;

答案 2 :(得分:0)

请根据MySQL \ Maria版本更改CTE定义语法。

$ brew reinstall gradle