SQL查询 - 按字符串排序(包含数字和字符)

时间:2015-06-08 15:22:43

标签: sql sql-server

我需要一些sql查询的帮助,但我无法解决这个问题。我需要按编号依次订购这些值。

有任何建议怎么做?

我正在处理Sql Server 2014,但我认为这无关紧要。

Cod_Turma   Turma
1           11-A
2           11-F
3           10-F
4           11-G
5           11-I
6           10-E
7           12-L
8           10-J
9           7-B
10          9-B
11          7-E
12          7-D
13          12-H

输出应为:

Cod_Turma   Turma
9           7-B
12          7-D
11          7-E
10          9-B
...

5 个答案:

答案 0 :(得分:5)

可能的解决方案:

SELECT * FROM TableName 
ORDER BY CAST(LEFT(Turma, CHARINDEX('-', Turma) - 1) AS INT), --left part
         SUBSTRING(Turma, CHARINDEX('-', turma), LEN(turma))  --right part

答案 1 :(得分:4)

DECLARE @t table (cod_turma int, turma varchar(10));

INSERT @t values
 (1,'11-A')
,(2,'11-F')
,(3,'10-F')
,(4,'11-G')
,(5,'11-I')
,(6,'10-E')
,(7,'12-L')
,(8,'10-J')
,(9,'7-B' )
,(10,'9-B')
,(11,'7-E')
,(12,'7-D')
,(13,'12-H')

SELECT * FROM @t
ORDER BY CAST(LEFT(Turma, CHARINDEX('-', Turma)-1) AS INT), SUBSTRING(turma, CHARINDEX('-', Turma), 1000) 

说明:将Turma分解为两个单独的值(int和字符);将int部分转换为int(这样你就不会得到1, 10, 2, 20, 3, 31的排序)并按顺序排序,然后按字母部分排序。

我已对此进行了编辑,以反映@Giorgi Nakeuri的帖子所提出的改进以及@TimSchemlter的评论。 (注意:我的初始帖子不起作用,我试图从时髦开始使用一些不正确的语法。)

答案 2 :(得分:0)

快速(仅适用于数字< 100 ):

_winreg

但有效:DEMO

答案 3 :(得分:0)

我认为Dan和Giorgi的答案都很好,但是出于各种各样的考虑,这里有一个使用PARSENAME()技巧的替代方法。

SELECT  Cod_Turma,
        Turma
FROM @yourTable
CROSS APPLY(SELECT REPLACE(Turma,'-','.')) CA(par)
ORDER BY CAST(PARSENAME(par,2) AS INT),PARSENAME(par,1)

答案 4 :(得分:-2)

按升序排序将首先按数字排序,然后按字母排序。 从Turma asc

中选择TableXX的Cod_Turma,Turma