替换 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。
我有这个查询:
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。