mysql - 如何为 JSON_OBJECT() 动态提供键和值?
问题描述
我在 MySQL 中搜索“FOR JSON PATH”(SQL Server)等效项,并遇到以下链接 - stackoverflow 问题
评价最高的解决方案完美运行,但是否可以动态提供列和值?我有 20 多列,手动添加每个键值对很忙且不容易维护。
SQL Server 查询 -
SELECT u.user_id, u.first_name,(
SELECT f.*
FROM files f
WHERE f.is_active = 1 AND f.user_id = u.user_id
FOR JSON PATH) as files
FROM users u
WHERE u.user_id = 1
上述查询的输出与使用 JSON_ARRAYAGG(JSON_OBJECT()) 函数生成的 1 相同。
解决方案
为了根据您对@Gordon Linoff 答案的评论明确键入列,您需要执行动态查询(PREPARED STATMENTS)。
set @qs = (SELECT
GROUP_CONCAT(COLS)
FROM (
SELECT
CONCAT(
'"',
`COLUMN_NAME`,
'",',
`COLUMN_NAME`
) as COLS
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = 'test'
AND `TABLE_NAME`='Files'
) t);
set @fin = CONCAT("SELECT u.user_id, u.first_name,
(SELECT JSON_ARRAYAGG(JSON_OBJECT(",@qs, "))
FROM Files f
WHERE f.is_active = 1 AND f.user_id = u.user_id
) as files
FROM Users u");
PREPARE dynamic_statement FROM @fin;
EXECUTE dynamic_statement;
DEALLOCATE PREPARE dynamic_statement;
推荐阅读
- flutter - 颤振中带有多选芯片的警报框
- maven - gradle 不是像 Maven 有 m2 那样有自己的仓库吗?
- python - Python:屏蔽电子邮件文本中的命名实体
- javascript - 如果尚未下载脚本,则跳过同步脚本执行
- reactjs - react-native:如何隐藏底部标签栏 onPress
- python - Python:单击图像后捕获 x,y 坐标并关闭图像
- android - Webview Xamarin Forms中的Websocket不起作用
- node.js - 使用 Mongoose 分组
- python - Pandas 将一系列值分配给特定位置的最有效方法
- android - Android 8 System App 更新仅在重启后生效