在 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 上替换逗号分隔结果上的数字的主要内容,如果未能解决你的问题,请参考以下文章

mysql 字段内容是用逗号分隔的。怎么按序列查询内容

在雪花结果集中用逗号分隔输出数字

在 3 位数字后用逗号分隔数字,白色管理字符串 iOS 上的小数位

如何在r中添加或减去逗号分隔的数字?

mysql将一个以逗号分隔的数字字符串转出数字

以逗号分隔的字符串形式返回一个数字