【问题标题】:sorting an alphanumeric column in sql在sql中对字母数字列进行排序
【发布时间】:2013-08-02 10:31:11
【问题描述】:

我有一个表“MyTable”,其后面的列 ID 为 varchar(50)。

ID
----------
10
100
700-6 0110B512
700-6 0110B513
700-8 0110B512
700-9 0110B512

我需要用输出对该列进行排序

ID
----------
10
100
700-6 0110B512
700-8 0110B512
700-9 0110B512
700-6 0110B513

请帮忙!!

我试过这样,但输出不如预期。

SELECT * FROM MyTable
ORDER BY
Case    
When IsNumeric(ID) = 1 then LEFT(Replicate('0',101) + ID, 100) 
When IsNumeric(ID) = 0 then RIGHT(Replicate('0',101) + ID, 100) 
Else ID  
END
ASC

【问题讨论】:

  • Isnumeric(id) = 1 会被击中吗?字段 ia varchar?
  • 它将被击中 10 和 100 !
  • 您最多有三位数字吗?所以 1、10、100、700 但不是 1000、2000、10000?
  • 它将始终为 3 位数字,大多数情况下仅为 700。
  • @vijay in mysql 如果你只是写 select * from table_name orderby column_name 然后它会自动排序,我不知道它是否适用于 sql server 2005。只需检查它

标签: sql sql-server-2005


【解决方案1】:
DECLARE @t table(id varchar(50))
INSERT @t values ('10')
INSERT @t values('100')
INSERT @t values('700-6 0110B512')
INSERT @t values('700-6 0110B513')
INSERT @t values('700-8 0110B512')
INSERT @t values('700-9 0110B512')

SELECT * 
FROM @t 
ORDER BY cast(left(id, 3) as int), stuff(id, 1, 6, ''), substring(id, 5,1)

【讨论】:

    【解决方案2】:

    假设固定的前导/尾随整数,我认为这是最简单的:

    SELECT *
    FROM table1 
    ORDER BY LEFT(id,3) ,RIGHT(id,3) ,ID
    

    SQL Fiddle

    如果需要,可以将任一部分转换为 INT,从示例中不清楚。

    【讨论】:

    • 将 20 放在 100 之后,但问题中没有任何内容表明这是错误的,所以... :)
    猜你喜欢
    • 2019-02-17
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多