为什么Order by不排序?

时间:2014-12-29 08:41:11

标签: sql oracle

我在下面有一个查询,我希望它按id对数据进行排序,但它根本不排序。

Select distinct ec.category,ec.id
from print ec
order by ec.id asc

可能是什么原因?

这是输出:

enter image description here

5 个答案:

答案 0 :(得分:7)

查看您的数据,列数据类型为varchar,即“文本”。

如果是文本,则根据文本在所用字符集中出现的位置进行排序。

因此,每个列都按照第一个字符排序,然后是第二个字符,等等。2位于11之后。

将列设为数字数据类型,例如number,或在排序中使用to_number

select distinct ec.category,ec.id
from print ec
order by to_number(ec.id)

答案 1 :(得分:2)

区别在于varcharnumber的排序方式。在您的情况下,由于您已使用varchar数据类型来存储number,因此会对ASCII值进行排序。

NUMBERS在排序为STRING

SQL> WITH DATA AS(
  2  SELECT LEVEL rn FROM dual CONNECT BY LEVEL < = 11
  3  )
  4  SELECT rn, ascii(rn) FROM DATA
  5  order by ascii(rn)
  6  /

        RN  ASCII(RN)
---------- ----------
         1         49
        11         49
        10         49
         2         50
         3         51
         4         52
         5         53
         6         54
         7         55
         8         56
         9         57

11 rows selected.

SQL>

如您所见,排序基于ASCII值。

NUMBER在排序为NUMBER本身

SQL> WITH DATA AS(
  2  SELECT LEVEL rn FROM dual CONNECT BY LEVEL < = 11
  3  )
  4  SELECT rn, ascii(rn) FROM DATA
  5  ORDER BY rn
  6  /

        RN  ASCII(RN)
---------- ----------
         1         49
         2         50
         3         51
         4         52
         5         53
         6         54
         7         55
         8         56
         9         57
        10         49
        11         49

11 rows selected.

SQL>

如何解决问题?

将数据类型更改为NUMBER。作为解决方法,您可以使用to_number

使用to_number -

SQL> WITH DATA AS(
  2  SELECT to_char(LEVEL) rn FROM dual CONNECT BY LEVEL < = 11
  3  )
  4  SELECT rn, ascii(rn) FROM DATA
  5  ORDER BY to_number(rn)
  6  /

RN   ASCII(RN)
--- ----------
1           49
2           50
3           51
4           52
5           53
6           54
7           55
8           56
9           57
10          49
11          49

11 rows selected.

SQL>

答案 2 :(得分:0)

确保“id”列的类型为int。 (整数=数字)

现在它可能是text,char或varchar(用于文本,字符串)。

您不能按字母顺序排序数字,也不能按时间顺序对字符串/文字进行排序。

答案 3 :(得分:0)

当您对具有in值的字符串数据类型进行排序时,它会将结果生成为

1

10

11

2

21等...

因此

  

将您的Id数据类型更改为int / bigint

答案 4 :(得分:0)

您只能在查询中转换/转换数据类型

选择不同的ec.category,ec.id 来自print ec 按强制转换(ec.id as int)asc