【发布时间】:2021-04-08 16:44:02
【问题描述】:
我有一个 MySQL 8.0.22 JSON 列,其中包含带有事先不知道的键的对象:
'{"x": 1, "y": 2, "z": 3}'
'{"e": 4, "k": 5}'
我想使用JSON_TABLE 将这些值扩展为包含键值对的多行:
| key | value |
|---|---|
| x | 1 |
| y | 2 |
| z | 3 |
| e | 4 |
| k | 5 |
当然,困难在于密钥是未知的先验。我想出的最好的事情是......
SET @json_doc = '{"x": 1, "y": 2, "z": 3}';
SELECT a.seq, b.k, a.v
FROM
JSON_TABLE(
@json_doc,
"$.*"
COLUMNS(
seq FOR ordinality,
v INT PATH "$"
)
) AS a,
JSON_TABLE(
JSON_KEYS(@json_doc),
"$[*]"
COLUMNS(
seq FOR ordinality,
k CHAR(1) PATH "$"
)
) AS b
WHERE a.seq = b.seq;
这感觉很奇怪,因为它使用了两个JSON_TABLE 调用,对值和键进行交叉连接,然后保持对齐。我想找到一个像这样更简单的查询...
SELECT a.seq, b.k, a.v
FROM
JSON_TABLE(
@json_doc,
"$.*"
COLUMNS(
seq FOR ordinality,
k CHAR(1) PATH "?" -- <-- what do I put here to find each key?
v INT PATH "$"
)
) AS a,
我知道这个问题可能可以通过 CTE 或数字表和 JSON_EXTRACT 来解决。但是,如果可能的话,我想找到一些高性能和可读的东西。
【问题讨论】: