按 varchar 列排序

Sort by varchar column

在 ms sql 数据库 table files_master 我有一个名为 'AstNum' varchar(100) 的列,它包含如下数据: 1/1980 2/1980 11/1980 等等当我对列进行排序时:

SELECT AstNum FROM Files_master ORDER BY AstNum ASC

它显示了列中的记录 1/1980,11/1980/1980 是斜线之前的年份是递增数字请帮助我如何对结果中我想要的记录进行排序 1/1980 2/1980 3/1980

试试这个

Select AstNum from Files_master Order by convert(datetime,'1/'+AstNum,101) ASC 

编辑:根据评论,这是另一个解决方案

Select AstNum from Files_master 
Order by 
parsename(replace(AstNum,'/','.'),2)*1 ASC,parsename(replace(AstNum,'/','.'),1)*1 ASC

这样很容易行不通,而且可能还违反了 standard database rules

您的方法是有两列,都是 int 类型,其中一列是索引,另一列是年份。比如说,你有列 idyear,那么你的请求将是

   SELECT `id`, `year` FROM Files_master ORDER BY `id` ASC, `year` ASC

请注意,您在 ORDER BY 语句中列出列的顺序取决于主要和次要顺序列,因此您可能首先想按年份排序。

如果你真的,真的,必须使用这种格式,只有到那时,你才可能找到一种方法来使用SUBSTRING_INDEX来分割你的字符串,并且然后有类似(未经测试)的东西:

    SELECT SUBSTRING_INDEX(`AstNum`, '/', 1) AS `id`, 
           SUBSTRING_INDEX(`AstNum`, '/', -1) AS `year` 
    ORDER BY `id` ASC,`year` ASC

请注意,这可能会很慢评估。


编辑:作为对评论的回复,因为事实证明正在使用 SQL 服务器而不是 MySQL (我在撰写本文时假设的)命令必须略有不同,更复杂(仍未经测试,偏移量可能..关闭):

    SELECT SUBSTRING(AstNum, 1, LEN(AstNum)-5) AS id, 
           SUBSTRING(AstNum, LEN(AstNum)-3, 4) AS year 
    ORDER BY id ASC, year ASC

如果需要先按年份排序-

SELECT AstNum
FROM Files_master
ORDER BY Cast(substring(AstNum, charindex('/', AstNum)+1, 4) as int) ASC,
         Cast(substring(AstNum, 1, charindex('/', AstNum)-1) as int) ASC 

如果您只需要按递增数字排序,那么-

SELECT AstNum
FROM Files_master
ORDER BY Cast(substring(AstNum, 1, charindex('/', AstNum)-1) as int) ASC