订单VARCHAR和NUMBER

时间:2016-11-10 12:49:13

标签: sql oracle sql-order-by

Column : VARCHAR

我有这个选择:

SELECT列FROM TABLE

ae
10000
10005
ad
ab
ac
10010

我希望像这样订购它们:(订购的数字然后是Varchar订购的)

SELECT列FROM TABLE ORDER BY列

1 - 10000
2 - 10005
3 - 10010
4 - ab
5 - ac
6 - ad
7 - ae

1 个答案:

答案 0 :(得分:2)

因为列是字符列,所以数字将按二进制排序。您想以数字方式对它们进行排序,这意味着您需要2个ORDER BY子句

  1. 数字,其中只考虑数字字符
  2. 标准二进制排序
  3. select column_name
      from table
     order by case when regexp_like(column_name, '^\d+$') then to_number(column_name) end
            , column_name
    

    正则表达式是

    • ^ - 锚定到字符串的开头
    • \d - 仅匹配数字
    • + - 任意次数匹配上一个表达式
    • $ - 锚定到字符串的末尾

    它用于强制在将列转换为初始排序的数字之前仅存在数字。

    更一般地说,将数字和字符放在同一列中并不明智,因为您已经发现并且因为它阻止您强制执行数据类型是正确的。

    最后,考虑一下您是否确实需要订购查询,排序通常仅用于显示目的或将某些业务逻辑应用于已排序数据集的“顶部”N个元素。