按年份和年份范围订购SQL表

时间:2017-03-16 02:35:15

标签: sql

我希望能够按以下方式订购结果。

有两列,一个存储年份,另一个存储范围,有时还包括日期,如下所示:

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),但通用解决方案可以,我可以查找语法)。

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

这是实现结果的一种方法:

SELECT 
    year_pub,
    date_freeform,
    COALESCE(CAST(year_pub AS VARCHAR(4)), date_freeform) AS year_list
FROM
    table_name
ORDER BY
    COALESCE(CAST(year_pub AS VARCHAR(4)), 
            CASE WHEN RIGHT(date_freeform, 4) = 'oing' 
                THEN '9999' 
                ELSE RIGHT(date_freeform, 4)
            END
    ) DESC,
    date_freeform DESC;