微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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 举报,一经查实,本站将立刻删除。