我在下面有一个查询,我希望它按id
对数据进行排序,但它根本不排序。
Select distinct ec.category,ec.id
from print ec
order by ec.id asc
可能是什么原因?
这是输出:
答案 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)
区别在于varchar
和number
的排序方式。在您的情况下,由于您已使用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