我有一个数据列表,我想订购降序,但我想从数字开始,然后转到字符串。
我正在寻找的例子。
43a
34a
22a
11d
ztc
xtc
ytc
但如果你这样做
SELECT list FROM table ORDER BY list DESC;
它输出这样的列表。
ztc
xtc
ytc
43a
34a
22a
11d
有办法做到这一点吗?
答案 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排序
答案 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