在 T-SQL 中按数字和字母混合的顺序对字符串进行排序

3
我有一些包含数字、有时还有字母的独特字符串,其中一个示例为:
  • 1X
  • 2X
  • 2Y
  • 12X
  • 20
  • 21
其中数字(或数字和字母)始终在字母之前。如何使用ORDER BY(T-SQL)子句来生成如上所示的顺序列表?
我尝试使用LEN(fieldName)、fieldname,但对于20和21这两个数字无效。我尝试将字符串表示为整数,但CAST转换过程失败。

你想要一个按数字排序,然后按字母排序的列表吗? - Elias
你的示例中,字母字符总是在值的末尾吗?还是它们可以出现在值的任何位置? - Panda_Claus
2
正确的是Elias,且“数字总是在字母之前”。 - cope
ORDER BY CASE WHEN ISNUMERIC(column)=1 THEN 1 ELSE 0 END,column - Mihai
以上解决方案仅关注第一个数字,即如果列表为21、12X、1X,则顺序将被改变为12X、1X、21。然后会出现不同的问题。 - cope
你是在谈论 @Mihai 的评论还是我的回答? - Elias
1个回答

2

I'm stealing my details from Here.

declare @t table(s varchar(25))
insert @t
select '122345684XT' union
select '23339034300-XT' union
select '423432424523242332X' union
 select '422222222111111111232' union
select '423842389034209XYZ' union
select 'ABC'

select 
    left(s,patindex('%[^0-9]%',S+' ')-1 ) nbr 
   ,right(s,len(s)-patindex('%[^0-9]%',S+' ')+1) alpha
from @t

这会导致
122345684               XT
23339034300             -XT
422222222111111111232   
423432424523242332      X
423842389034209         XYZ
ABC

在您的环境中使用它。

SELECT * 
FROM YourTable 
ORDER BY left(s,patindex('%[^0-9]%',S+' ')-1 ), 
         right(s,len(s)-patindex('%[^0-9]%',S+' ')+1)

展示者:

declare @t table(s varchar(25))
insert @t
select '12X' union
select '1X' union
select '2X' union
select '2Y' union
select '20' union
select '21'

SELECT * 
FROM @t
ORDER BY CAST(left(s,patindex('%[^0-9]%',S+' ')-1 ) AS INT), 
         right(s,len(s)-patindex('%[^0-9]%',S+' ')+1)

结果

1X
2X
2Y
12X
20
21

1
已经实现了代码并测试了几十个组合,看起来它的功能完全符合要求。谢谢。 - cope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接