我目前的表格结构如下:
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一起使用,但是到目前为止,我还没有找到确定如何正确声明它的运气。任何帮助表示赞赏。
答案 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