【问题标题】:T-SQL ORDER BY number and letters mixed in stringT-SQL ORDER BY 数字和字母混合在字符串中
【发布时间】:2014-10-12 16:38:31
【问题描述】:

我有一系列 独特 字符串,其中包含数字,有时还包含数字和一个字母,其中的一个示例如下:

  • 1X
  • 2X
  • 2 年
  • 12X
  • 20
  • 21

数字总是在字母之前。什么是 ORDER BY (T-SQL) 子句解决方案来生成一个列表,它会给我上面展示的顺序?

我尝试过使用

LEN(fieldName), fieldname - 除了 20 和 21 也可以。我尝试将字符串表示为整数,但 CAST 在转换中失败过程。

【问题讨论】:

  • 所以你想要一个按数字排序的列表,然后按字母排序?
  • 字母字符是否总是像您的示例一样位于值的末尾,或者它们可以在值中的任何位置?
  • 正确的 Elias 和“数字总是在字母之前”。
  • ORDER BY CASE WHEN ISNUMERIC(column)=1 THEN 1 ELSE 0 END,column
  • 上述解决方案只关注第一个数字,即如果列表为 21、12X、1X,则顺序将更改为 12X、1X、21。然后出现不同的问题。

标签: sql string sql-order-by


【解决方案1】:

我正在从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

【讨论】:

  • 已经实现了代码并测试了几十种组合,这似乎完全符合要求。谢谢。
猜你喜欢
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2023-03-17
  • 2014-10-12
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多