替换 MYSQL 上逗号分隔结果中的数字

Replacing numbers on a comma delimited result on MYSQL

我有这个查询:

SELECT delMonth FROM futRoot

这给出了结果:

有没有办法可以产生结果,将那里的数字更改为缩短的月份名称?使用图像,所需的结果将是:

Mar,Jun,Sept,Dec
Feb,Apr,Jun,Aug,Oct,Dec 
Feb,Apr,Jun,Aug,Oct,Dec
Feb,Apr,Jun,Aug,Oct,Dec
Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec

我知道此代码可以生成缩短的月份:

DATE_FORMAT(STR_TO_DATE(monthNumber, '%m'), '%b')

我的问题是如何从字符串中获取 monthNumber,然后在将它们转换为缩短的月份后以某种方式连接它们。

如有任何帮助,我们将不胜感激。谢谢!

这是一个骇人听闻的解决方案,但它确实有效并且清晰易读,因为您只有十二个可能的值。

SELECT TRIM(TRAILING ',' FROM CONCAT(
    CASE WHEN FIND_IN_SET(1, delMonth) THEN 'Jan,' ELSE '' END,
    CASE WHEN FIND_IN_SET(2, delMonth) THEN 'Feb,' ELSE '' END,
    CASE WHEN FIND_IN_SET(3, delMonth) THEN 'Mar,' ELSE '' END,
    CASE WHEN FIND_IN_SET(4, delMonth) THEN 'Apr,' ELSE '' END,
    CASE WHEN FIND_IN_SET(5, delMonth) THEN 'May,' ELSE '' END,
    CASE WHEN FIND_IN_SET(6, delMonth) THEN 'Jun,' ELSE '' END,
    CASE WHEN FIND_IN_SET(7, delMonth) THEN 'Jul,' ELSE '' END,
    CASE WHEN FIND_IN_SET(8, delMonth) THEN 'Aug,' ELSE '' END,
    CASE WHEN FIND_IN_SET(9, delMonth) THEN 'Sep,' ELSE '' END,
    CASE WHEN FIND_IN_SET(10, delMonth) THEN 'Oct,' ELSE '' END,
    CASE WHEN FIND_IN_SET(11, delMonth) THEN 'Nov,' ELSE '' END,
    CASE WHEN FIND_IN_SET(12, delMonth) THEN 'Dec,' ELSE '' END
))
FROM futRoot;

月份将始终按日期顺序显示,无论它们在数字字符串中的显示顺序如何。

正如评论中所指出的,如果您重新设计数据库以删除逗号分隔字段,这个(以及许多其他问题)会更容易解决。有关详细信息,请参阅 Is storing a delimited list in a database column really that bad?

您可以只使用一堆 replace() 语句。例如:

select replace(replace(replace(delMonth, '12', 'Dec'), '11', 'Nov', '10', 'Oct')

您只需将其延长至全部 12 个月。按降序排列月份可以防止 12 变成 JanFeb。