如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?
Posted
技术标签:
【中文标题】如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?【英文标题】:How can I use an IF or Case function to summarize a GROUP_CONCAT column? AND then apply it to the original data table? 【发布时间】:2021-11-16 13:05:59 【问题描述】:我是 mysql 的新手,希望得到任何指点 - 这里的目标是以某种方式使用 GROUP_CONCAT 自动化分类字段,然后在 new_column 中总结 GROUP_CONCAT 字段中的某些模式。此外,是否可以在一次查询中将 new_column 添加到原始表中?以下是我尝试过的方法,如果有帮助,则会出现未知列“代码”的错误:
SELECT
`ID`,
`Code`,
GROUP_CONCAT(DISTINCT `Code` ORDER BY `Code` ASC SEPARATOR ", ") AS `Codes`,
IF(`Codes` LIKE '123%', 'Description1',
IF(`Codes` = '123, R321', 'Description2',
"Logic Needed"))
FROM Table1
GROUP BY `ID`
我想用 CASE 语句代替嵌套的 if 语句。原因是我已经有大约 1000 行逻辑已经写成“如果 [列] =”?可能是这样的:
SELECT
`ID`,
`Code`,
GROUP_CONCAT(DISTINCT `Code` ORDER BY `Code` ASC SEPARATOR ", ") AS `Codes`,
CASE
WHEN `Codes` LIKE '123%' THEN 'Description1'
WHEN `Codes` = '123, R321' THEN 'Description2'
ELSE "Logic Needed"
END
FROM Table1
GROUP BY `ID`
表格示例:
ID,Code
1,R321
1,123
2,1234
3,1231
4,123
4,R321
完成表:
ID,Codes,New_Column
1,"123, R321",Description2
2,1234,Description1
3,1231,Description1
4,"123, R321",Description2
那么如何将汇总数据添加回原始表格?
决赛桌:
ID,Code,New_Column
1,R321,Description2
1,123,Description2
2,1234,Description1
3,1231,Description1
4,123,Description2
4,R321,Description2
谢谢。
【问题讨论】:
您使用了不正确的条件顺序。当Codes = '123, R321'
也匹配Codes LIKE '123%'
- 因此永远不会选择第二个选项。交换它们(始终将详细模式放在常见模式之前)。
很好,这在技术上是我的一个发布错误。一定会考虑到我的项目。谢谢,Akina。
【参考方案1】:
您不能在同一查询中引用列别名。需要在子查询中做GROUP_CONCAT()
,然后主查询可以参考Codes
总结一下。
选择Code
也没有意义,因为组中没有单个Code
值。
SELECT ID, Codes,
CASE
WHEN `Codes` = '123, R321' THEN 'Description2'
WHEN `Codes` LIKE '123%' THEN 'Description1'
ELSE "Logic Needed"
END AS New_Column
FROM (
SELECT
`ID`,
GROUP_CONCAT(DISTINCT `Code` ORDER BY `Code` ASC SEPARATOR ", ") AS `Codes`
FROM Table1
GROUP BY ID
) AS x
正如评论中提到的,WHEN
子句是按顺序测试的,因此您需要先放置更具体的案例。您可能想要使用FIND_IN_SET()
而不是LIKE
,因为123%
将匹配1234
,而不仅仅是123, something
【讨论】:
太棒了,巴马尔。我会尽快测试并让你知道。此外,对于 CASE 语句的排序 - 我完全理解;我重写了我的示例以使 ASC 有意义,并且没有重新排序 WHEN 语句。非常感谢您的时间和帮助。以上是关于如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在spark sql lag函数中添加if或case条件
MySQL:如何使用 CASE 或 IF 匹配较短的列的长度?