首页 > 解决方案 > 如何为 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 相同。

标签: mysqlsql

解决方案


为了根据您对@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;

请参阅此处的示例小提琴。


推荐阅读