【发布时间】:2017-03-16 13:09:57
【问题描述】:
我希望能够按以下方式对结果进行排序。
有两列,一列存储年份,另一列存储年份范围,有时还存储日期,如下所示:
2017
2016
2014–2016
1980-ongoing
2013
2000 28-27 March
1970
目前,我将它们连接起来并按 DESC 排序,得到这个(显示连接的临时列):
order by CONCAT(IFNULL(CAST(Year_Pub AS VARCHAR(16)) THEN '' ELSE CAST(Year_Pub AS VARCHAR(16))), IFNULL(Date_Freeform THEN '' ELSE Date_Freeform)) DESC
结果是:
2017
2016
2014-2016
2013
200028-27 March
1980-ongoing
1970
但是,我想得到的是这个(想象一下这是一份简历或类似活动的列表):
1980-ongoing
2017
2016
2014-2016
2013
2000
1970
也就是说,如果有年份跨度,我希望首先出现正在进行的约定,按开始年份排序,然后有年份跨度按去年排序并与单个年份混合。日期仅在 Year_Pub 为 NULL 并且必须在连接之前删除时才会出现,我想。
分隔符是一个 ndash,所以我需要以某种方式拆分这些字符串,正如我从示例中看到的那样,这些示例显示了如何在一个列中有名字和姓氏的表中按姓氏排序,但这是一个更多复杂的情况,我对 SQL 不是很熟悉。
此外,此操作将在应用程序附带的表上执行,因此我不想将数据或列插入到他们的数据库中,以防万一出现问题。
在ElevateDB 数据库上使用 SQL(SQL 2003 标准 (ANSI ISO/IEC 9075:2003),但通用解决方案也可以,我可以查找语法)。
感谢您的建议。
【问题讨论】:
-
您的数据似乎难以阅读和解析。
28-27 March是一个年份范围吗(可能数据会更像28/03-31/08、28 May-01 November...?你有1980-ongoing,那么你有1990-now或1991-keepgoing还是.....? -
@Pham 是的,我知道,但这就是我所拥有的。但是,它始终是“正在进行的”,并且始终是“00-00 月”,没有年份。我想,可以在 ndash 之后假设四个字符来获取年份或搜索“正在进行”的匹配,这应该可以。 '00-00 Month' 条目仅在年份也存在时才会出现,并且可以在连接之前忽略/删除。 ??
-
啊,您的评论就是您问题的答案。现在您可以为此编写查询。
-
@Pham :) 问题是我对 SQL 及其功能和原理一无所知,最好看看如何形成它。例如,如何仅出于排序目的从表中删除某些内容而不会影响实际数据?
标签: sql