如何按数字排序列表,然后按字符串递减排序?

时间:2014-02-06 22:20:19

标签: sql sql-server

我有一个数据列表,我想订购降序,但我想从数字开始,然后转到字符串。
我正在寻找的例子。

43a
34a
22a
11d
ztc
xtc
ytc

但如果你这样做

SELECT list FROM table ORDER BY list DESC;

它输出这样的列表。

ztc
xtc
ytc
43a
34a
22a
11d

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:2)

测试表

CREATE TABLE Data (str varchar(3))

INSERT INTO Data
SELECT '43a' UNION
SELECT '34a' UNION
SELECT '22a' UNION
SELECT '11d' UNION
SELECT 'ztc' UNION
SELECT 'xtc' UNION
SELECT 'ytc' 

<强> TSQL

SELECT str FROM DATA
ORDER BY 1-ISNUMERIC(LEFT(str, 1)) , str DESC

ISNUMERIC返回1代表一个数字,0代表非数字,所以如果你先按1-ISNUMERIC排序 - 数字首先出现。之后,您可以按字段DESC排序

演示:http://sqlfiddle.com/#!3/e92a08/6

答案 1 :(得分:1)

这样的事情:

;WITH CTE
AS
(
SELECT A FROM (VALUES('ztc'), ('xtc'), ('ytc'),('43a'),('34a'),('22a'),('11d')) T(A)
)
SELECT * FROM CTE
ORDER BY Left(A, PATINDEX('%[a-Z]%', A) - 1) DESC

答案 2 :(得分:0)

您可以将其拆分为两个查询临时表。

DECLARE @TempList AS TABLE(
     listItem AS varchar(max)
)

在第一个查询中,您可以使用:

INSERT INTO @TempList (listItem)
SELECT list 
FROM table 
Where ISNUMERIC(SUBSTRING(LTRIM(list), 1, 1))
ORDER BY list DESC;

这将选择以数字开头的所有条目,并按降序将它们添加到列表中。

然后,您只需从WHERE语句中删除'NOT'字母:

Insert into @TempList
SELECT list 
FROM table 
Where Not ISNUMERIC(SUBSTRING(LTRIM(list), 1, 1))
ORDER BY list DESC;

最后,要获得完整列表,您只需使用:

SELECT listItem FROM @TempList