问题描述
我的架构看起来像,
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
的每个值进行硬编码的情况下做到这一点?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)