mysql - 如何使用 json 数组从 JSON 文档中提取不同的值?
问题描述
我正在使用8.0.18-commercial
并编写以下MySQL
查询来形成cross join with JSON documents
.
请注意,中的条目数与中的条目
数servers[]
相同。objectIds[]
servers[]
objectIds[]
SELECT t1.networkInfo->>"$.*" AS network,
t1.objectIds,
j.server
FROM table1 t1
CROSS JOIN JSON_TABLE(t1.servers,
"$[*]" COLUMNS (
server VARCHAR(20) PATH '$'
)
) j
WHERE t1.id = 56
输出
network server objectIds
["abc.com", "Linux123", "RHEL"] Server123 ["objectId123", "objectId1231", "objectId1232"]
["abc.com", "Linux123", "RHEL"] Server1231 ["objectId123", "objectId1231", "objectId1232"]
["abc.com", "Linux123", "RHEL"] Server1232 ["objectId123", "objectId1231", "objectId1232"]
我想在查询中添加另一个联接,以便输出如下所示:
预期产出
network server objectIds
["abc.com", "Linux123", "RHEL"] Server123 objectId123
["abc.com", "Linux123", "RHEL"] Server1231 objectId1231
["abc.com", "Linux123", "RHEL"] Server1232 objectId1232
解决方案
您可以通过以与objectIds
列相同的方式对列进行解包,为每个使用servers
添加行号列并将该行号用于and表来获得所需的结果:JSON_TABLE
FOR ORDINALITY
JOIN
servers
objectIds
SELECT t1.networkInfo->>"$.*" AS network, s.server, o.objectId
FROM table1 t1
CROSS JOIN JSON_TABLE(t1.servers,
"$[*]" COLUMNS (
rownum FOR ORDINALITY,
server VARCHAR(20) PATH '$'
)
) s
JOIN JSON_TABLE(t1.objectIds,
"$[*]" COLUMNS (
rownum FOR ORDINALITY,
objectId VARCHAR(20) PATH '$'
)
) o ON o.rownum = s.rownum
WHERE t1.id = 56
输出:
network server objectId
["abc.com", "Linux123", "RHEL"] Server123 objectId123
["abc.com", "Linux123", "RHEL"] Server1231 objectId1231
["abc.com", "Linux123", "RHEL"] Server1232 objectId1232
推荐阅读
- visual-studio-code - 如何在vscode中将css hex转换为大写?
- c++ - 反向字符串程序无法正常工作
- python - 使用 python 构建一个翻译器。我不知道为什么翻译=翻译+“G”
- awk - 提取 aws 凭证文件的键值对
- python - python检查字符串是否包含具有某种格式的“单词”
- java - Java 抽象原始数组加法
- python - 如何提取此 span 标签中括号内的数字?
- r - 将 lm 与 summarise/across 一起应用时丢失列名
- android - Flutter ThemeData 中 FAB 图标的颜色属性
- java - 杰克逊反序列化 - 错误的身体类型成功反序列化