在mysql 8中动态提取和显示字段值作为标题

问题描述

我的架构看起来像,

CREATE TABLE `Log` (
 `id` int,`changeData` json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

数据看起来像,

INSERT INTO `Log`
(`id`,`changeData`)
VALUES
(1,'{"value": 4680,"SalaryType": "Housing Allowance"} '),(1,'{"value": 5000,"SalaryType": "Other"} '),(2,'{"value": 10000,'{"value": 5500,'{"value": 700,"SalaryType": "Transport"} ')
;

计划是将工资类型显示为列标题。以下查询将起作用,但这意味着在 case 语句中对 SalaryType 的每个可能值进行硬编码,这可能是十个数字,并且每次都会添加新的值,这意味着添加更多的 case 语句。

SELECT 
    `id`,MAX(CASE
        WHEN TRIM(BOTH '"' FROM (JSON_EXTRACT(changeData,'$.SalaryType'))) = 'Housing Allowance' THEN JSON_EXTRACT(changeData,'$.value')
        ELSE 0
    END) AS 'Housing Allowance','$.SalaryType'))) = 'Other' THEN JSON_EXTRACT(changeData,'$.value')
        ELSE 0
    END) AS 'Other','$.SalaryType'))) = 'Transport' THEN JSON_EXTRACT(changeData,'$.value')
        ELSE 0
    END) AS 'Transport'
FROM
    `Log`
GROUP BY `id`;

查询输出如下,这是正确的,

id  Housing Allowance   Other   Transport
1   4680                5000      0
2   10000               5500      700

有没有办法在不对 case 语句中 SalaryType 的每个值进行硬编码的情况下做到这一点?

dbfiddle

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)