在 MYSQL 上替换逗号分隔结果上的数字
Posted
技术标签:
【中文标题】在 MYSQL 上替换逗号分隔结果上的数字【英文标题】:Replacing numbers on a comma delimited result on MYSQL 【发布时间】:2016-06-30 11:05:16 【问题描述】:我有这个问题:
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,然后在将它们转换为缩短的月份后以某种方式连接它们。
任何帮助将不胜感激。谢谢!
【问题讨论】:
修复您的数据模型,这样您就不会在字符串中存储 id 列表。这是一种非常、非常、非常糟糕的存储列表的方式。提示:使用联结表。 你好,戈登。尽我所能,我无法更改数据库上的任何内容以及数据的保存方式。 :( 我会记下您的建议以供将来参考。 【参考方案1】:这是一个骇人听闻的解决方案,但它很有效,而且几乎清晰易读,因为您只有 12 个可能的值。
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;
月份将始终按日期顺序显示,无论它们在数字字符串中出现的顺序如何。
正如 cmets 中所指出的,如果您重新设计数据库以删除逗号分隔的字段,这个(以及许多其他问题)将更容易解决。详情请见Is storing a delimited list in a database column really that bad?。
【讨论】:
感谢您的信息 :D 尽管我想重新设计数据库,但更改它会影响许多系统。我测试了你的代码,它有帮助。谢谢!【参考方案2】:您可以只使用一堆replace()
语句。例如:
select replace(replace(replace(delMonth, '12', 'Dec'), '11', 'Nov', '10', 'Oct')
您只需将其延长至全部 12 个月。按降序排列月份可以防止 12 变成一月二月。
【讨论】:
以上是关于在 MYSQL 上替换逗号分隔结果上的数字的主要内容,如果未能解决你的问题,请参考以下文章