如何对按字母顺序排列的文本字段进行排序?

Ric*_*ick 7 sql-server ms-access

我有几个需要排序的记录,但字段是varchar.他们使用AZ的英文字母.Z之后它来自AA,AB,AC等...例如:

CREATE TABLE #foo(x VARCHAR(30));

INSERT #foo(x) SELECT 'A'
UNION SELECT 'AA'
UNION SELECT 'Z'
UNION SELECT 'B'
UNION SELECT 'AB'
UNION SELECT 'BB';
Run Code Online (Sandbox Code Playgroud)

我想要的结果是:

A
B
Z
AA
AB
BB
Run Code Online (Sandbox Code Playgroud)

我知道我应该使用数字字段并按此排序,但目前我没有这个选项.我正在使用SQL Server,而前端是在Access 2010中的报表上.

小智 13

这可能会奏效.您可以按值的长度进行排序,该值将对单个字符进行分组,后跟双字符.在这些组中,值将按字母顺序排序.

SELECT      Column1 
FROM        dbo.Table1 
ORDER BY    LEN(Column1)
        ,   Column1
Run Code Online (Sandbox Code Playgroud)


Jam*_*ran 6

好的,我有点困惑.听起来你想要一个时髦的排序顺序.你首先需要单个字母,然后是正常的排序顺序.(完全正常的排序会有A,AA,AB,AC,然后B)

首先,在字母字段上进行简单排序

 select SORTFIELD, OTHER, COLUMNS, IN-TABLE
 from  MYTABLE
 order by SORTFIELD
Run Code Online (Sandbox Code Playgroud)

但那不是你想要的.问题是你永远不会告诉我们你想要AAA的地方.它是在AA之后还是在ZZ之后?

ZZ之后的AAA:

 select SORTFIELD, OTHER, COLUMNS, IN-TABLE
 from  MYTABLE
 order by LEN(SORTFIELD), SORTFIELD
Run Code Online (Sandbox Code Playgroud)

AA之后的AAA(AB之前)

 select SORTFIELD, OTHER, COLUMNS, IN-TABLE
 from  MYTABLE
 order by case LEN(SORTFIELD) when 1 then 0 else 1 end , SORTFIELD
Run Code Online (Sandbox Code Playgroud)


kd7*_*kd7 5

Declare @SomeStuff table (val varchar(10));

Insert @SomeStuff (val) Values ('a');
Insert @SomeStuff (val) Values ('b');
Insert @SomeStuff (val) Values ('c');
Insert @SomeStuff (val) Values ('az');
Insert @SomeStuff (val) Values ('ab');
Insert @SomeStuff (val) Values ('zz');
Insert @SomeStuff (val) Values ('abc1');


Select * From @SomeStuff order by LEN(val), val
Run Code Online (Sandbox Code Playgroud)

使用SQL Server但仍应该工作.

结果:

val
---
a
b
c
ab
az
zz
abc1
Run Code Online (Sandbox Code Playgroud)