2016-11-10 46 views
0
Column : VARCHAR 

我有这样的选择:从表订购VARCHAR和数量

ae 
10000 
10005 
ad 
ab 
ac 
10010 

SELECT列,我想订购他们是这样的:(数量排序,然后的Varchar订购)

SELECT列FROM TABLE ORDER BY column

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

从来没有混合的字母和数字?你想在10之前还是之后2? – jarlh

+0

有一个混合 –

+0

你试过你选择语句吗?你有什么结果? – JSapkota

回答

2

由于列是字符列,因此数字将按二进制排序排序。你想他们用数字排序,这意味着你需要2 ORDER BY子句

  1. 一个数字,只有数字字符被认为是
  2. 标准的二叉排序
select column_name 
    from table 
order by case when regexp_like(column_name, '^\d+$') then to_number(column_name) end 
     , column_name 

常规表达是

  • ^ - 锚字符串
  • \d的开始 - 只匹配数字
  • + - 锚字符串

它提供的结束 - 任意次数

  • $匹配前面的表达式强制在将列转换为初始排序的数字之前仅存在数字。

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

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

  • +0

    如果在CASE表达式中求值的第一个'column_name'不是一个数字,那么'CASE'生成的'NULL'将是一个“string”NULL。如果后面有一个“数字”,“CASE”会产生一个数字,运行时会发出错误。您需要将'else cast(null as number)'添加到CASE表达式中以防止出现这种情况。 – mathguy

    +0

    你能证明@mathguy?我已经测试过这个,甚至用子表达式'(select * from table_name order by column_name desc)'替换'table',以强制你正在谈论的情况。有谓谓推动的小危险,是的,但添加演员阵容并不一定有帮助。 – Ben

    +0

    嗯...我收回。我只是对它进行了测试,似乎并不像我想的那样。我过去遇到过这个问题,可能是用'UNION',所以我认为这在所有类似情况下都会成为问题。无论如何,您的解决方案按原样运行。 – mathguy