首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在SQL Server中对字母数字字符串进行排序

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

Stack Overflow用户
提问于 2011-08-05 00:29:27
回答 3查看 4.8K关注 0票数 1

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

示例字符串:

代码语言:javascript
运行
复制
D12,D13
F19,F20
A12,A13
F10,F11
D14
A1,A2
A5,A6
D4,D5
F5,F6,F7

所需输出:

代码语言:javascript
运行
复制
A1,A2
A5,A6
A12,A13
D4,D5
D12,D13
D14
F5,F6,F7
F10,F11
F19,F20

救救我!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-06 02:25:39

基于新的需求和@kuru kuru的回答,我希望这个order by子句说明了为什么规范化是一件好事。仅仅因为它对JSON和Ajax有好处并不意味着您应该这样对待您的数据库:

代码语言:javascript
运行
复制
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
    );
票数 1
EN

Stack Overflow用户

发布于 2011-08-05 01:30:33

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

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

字母部分和数字部分,否则就没有办法"A5,...“了。将在"A12,...“之前排序,因为在比较字符串值时,"A5”在"A1“之后。为了获得正确的排序顺序,您必须解析这些值并将"A5“转换为"A05”(或需要多少有效数字)。

  • 您是否忽略了每个字符串中逗号后的其他项?如果答案是否定的,那么您必须对字符串中的每个值执行#1中描述的处理。例如,是否可以将"A5,A6“放在"A5,A12”之前进行排序?

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

票数 1
EN

Stack Overflow用户

发布于 2011-08-06 01:44:50

我不敢相信每个人都在说TSQL的坏话。:-)

在对数据进行排序之前,您不必对数据进行标准化。(当然,在任何情况下都不是显式的-- SQL引擎在处理ORDER BY子句时只需戴上一些护目镜,它就可以很好地工作)。

这是一个在TSQL中工作的示例...我知道看起来右侧没有理由正确排序,但它实际上确实正确排序。

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6945097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档