如果仅是这些数据,那么直接写一个order by 当然可以。但是我估计lz的题目根本没记住人家问什么,这里的问题描述是不完整的。笔试不会出这么简单的题目。
--你的原题,可直接排序 DECLARE @t TABLE ( n VARCHAR(10) ) INSERT INTO @t SELECT '13-1' union SELECT '13-2' union SELECT '13-4' union SELECT '13-7' union SELECT '13-3' union SELECT '14-1' union SELECT '13-8' union SELECT '14-2' union SELECT '13-9'SELECT * FROM @t ORDER BY n /* 13-1 13-2 13-3 13-4 13-7 13-8 13-9 14-1 14-2 * */
--前后两半部分的位数都不一致的情况下如何排序 DECLARE @t TABLE ( n VARCHAR(10) ) INSERT INTO @t SELECT '13-1' union SELECT '13-2' union SELECT '13-4' union SELECT '13-7' union SELECT '13-3' union SELECT '14-1' union SELECT '13-8' union SELECT '14-2' union SELECT '13-9' UNION SELECT '1-1' union select '2-1' union select '4-10' union select '4-101'SELECT n, SUBSTRING(n,1,CHARINDEX('-',n)-1) AS 前半部分, SUBSTRING(n,CHARINDEX('-',n)+1,LEN(n)-CHARINDEX('-',n)) AS 后半部分 FROM @t ORDER BY --取出前半部分,并转为INT再排序 CONVERT(INT,SUBSTRING(n,1,CHARINDEX('-',n)-1)), --取出后半部分,并转为INT再排序 CONVERT(INT,SUBSTRING(n,CHARINDEX('-',n)+1,LEN(n)-CHARINDEX('-',n)))
当然是 order by。只不过需要两个,例如,首先按前两个字符排序,然后才按所有字符排序。
DECLARE @t TABLE ( n VARCHAR(10) )
INSERT INTO @t
SELECT '13-1' union
SELECT '13-2' union
SELECT '13-4' union
SELECT '13-7' union
SELECT '13-3' union
SELECT '14-1' union
SELECT '13-8' union
SELECT '14-2' union
SELECT '13-9'SELECT * FROM @t ORDER BY n
/*
13-1
13-2
13-3
13-4
13-7
13-8
13-9
14-1
14-2
* */
DECLARE @t TABLE ( n VARCHAR(10) )
INSERT INTO @t
SELECT '13-1' union
SELECT '13-2' union
SELECT '13-4' union
SELECT '13-7' union
SELECT '13-3' union
SELECT '14-1' union
SELECT '13-8' union
SELECT '14-2' union
SELECT '13-9' UNION
SELECT '1-1' union
select '2-1' union
select '4-10' union
select '4-101'SELECT n,
SUBSTRING(n,1,CHARINDEX('-',n)-1) AS 前半部分,
SUBSTRING(n,CHARINDEX('-',n)+1,LEN(n)-CHARINDEX('-',n)) AS 后半部分
FROM @t ORDER BY
--取出前半部分,并转为INT再排序
CONVERT(INT,SUBSTRING(n,1,CHARINDEX('-',n)-1)),
--取出后半部分,并转为INT再排序
CONVERT(INT,SUBSTRING(n,CHARINDEX('-',n)+1,LEN(n)-CHARINDEX('-',n)))