如何在SQL Server中对字母数字字符串进行排序

时间:2011-08-04 16:29:27

标签: sql-server sql-server-2008 sql-server-2008-r2

我想对字母数字字符串进行排序... 简单字符串:

D12,D13
F19,F20
A12,A13
F10,F11
D14
A1,A2
A5,A6
D4,D5
F5,F6,F7

期望的输出:

A1,A2
A5,A6
A12,A13
D4,D5
D12,D13
D14
F5,F6,F7
F10,F11
F19,F20

帮助我!!!!

3 个答案:

答案 0 :(得分:1)

正如@JNK和@Aaron Bertrand所提到的,T-SQL并不是这项任务的最佳选择。

话虽如此,还有几个问题需要解决。

  1. 你将不得不将每个项目分成两个部分,alpha部分和数字部分,否则“A5,...”将无法在“A12,...之前进行排序。 ..“,因为”A5“在比较字符串值时位于”A1“之后。您必须解析这些值并将“A5”变为“A05”(或者您需要的许多有效数字)才能获得正确的排序顺序。

  2. 您是否在每个字符串中的逗号后面忽略了其他项目?如果答案为否,那么您将不得不对字符串中的每个值执行#1中描述的处理。例如,是否可以使用“A5,A6”并且您希望在“A5,A12”之前排序该值?

  3. 一旦对字符串中的值进行了规范化,就可以进行比较和排序。

答案 1 :(得分:1)

根据新的要求和松散的@kuru kuru的回答,我希望这个order by子句能说明为什么规范化是一件好事。仅仅因为它对JSON和Ajax有好处并不意味着你应该如何对待你的数据库:

DECLARE @t TABLE (x VARCHAR(32));

INSERT @t VALUES
  ('D12,D13'),
  ('F19,F20'),
  ('A12,A13'),
  ('F10,F11'),
  ('D14'),
  ('A1,A2'),
  ('A5,A6'),
  ('D4,D5'),
  ('F5,F6,F7'),
  ('AA1,AA2'),
  ('Z98,Z99');

SELECT x FROM @t
ORDER BY CASE 
    WHEN UPPER(x) LIKE '[A-Z][A-Z]%'
    THEN 'Z' + LEFT(x,2) ELSE LEFT(x,1) END,
    CONVERT(INT, 
      CASE WHEN x LIKE '%,%' THEN 
        SUBSTRING(x, PATINDEX('%[0-9]%', x), 
        CHARINDEX(',', x)-PATINDEX('%[0-9]%', x))
      ELSE 
        SUBSTRING(x, PATINDEX('%[0-9]%', x), 32)
      END
    );

答案 2 :(得分:0)

我无法相信每个人都在说这些关于TSQL的事情。 :-)

在排序之前,您不必对数据进行规范化。 (好吧,在任何情况下都没有明确说明 - SQL引擎在处理ORDER BY子句时可以只穿一些啤酒护目镜,它会正常工作。)

这是一个在TSQL中运行的示例...我知道看起来像没有理由让右侧正确订购,但实际上它确实是正确的。

declare @table TABLE (item varchar(10))
insert into @table(item) values('FF5')
insert into @table(item) values('Z10')
insert into @table(item) values('F15')
insert into @table(item) values('F20')
insert into @table(item) values('A7')
insert into @table(item) values('A12')

SELECT
    item
FROM
    @table
ORDER BY
    CASE WHEN SUBSTRING(item,2,1) LIKE '[A-Z]' THEN LEFT(item,2) ELSE LEFT(item,1) END