按数字顺序对包含字母的数字进行排序

时间:2020-01-15 11:24:54

标签: sql tsql

我有一系列ID,其中包含数字,但有时也包含字母。 例如:

    1,
    A1,
    B1,
    A10,
    A11,
    2,
    A2,
    A20,
    B2,
    3,
    A3,
    B3,
    4,
    A4,
    B4
    5,
    A5
    B5

我需要将它们排序如下:

    A1,
    A2,
    A3,
    A4,
    A5,
    A10,
    A11,
    A20,
    B1,
    B2,
    B3,
    B4,
    B5,
    1,
    2,
    3,
    4,
    5

做到这一点的最佳方法是什么?

ID是从外部提供给我的,不能更改。

1 个答案:

答案 0 :(得分:3)

该问题最初被标记为MySQL。

如果前缀只有一个字母,则可以执行以下操作:

order by (id regexp '^[A-Z]') desc,                            -- put letters first
         (case when id regexp '^[A-Z]' then left(id, 1) end),  -- order by letter
         length(id) asc,
         id

在SQL Server中,您可以将其表示为:

order by (case when id like '[A-Z]%' then 1 else 2 end),
         (case when id like '[A-Z]%' then left(id, 1) end),
         length(id),
         id