按 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
类型,其中一列是索引,另一列是年份。比如说,你有列 id
和 year
,那么你的请求将是
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
在 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
类型,其中一列是索引,另一列是年份。比如说,你有列 id
和 year
,那么你的请求将是
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