ORDER BY(VARCHAR)和ORDER BY TO_NUMBER(VARCHAR)之间的区别

时间:2018-10-01 09:36:19

标签: oracle plsql

在下面的两个查询集中,它将与同一组值相同,其中在一种情况下,float和另一种情况下比较具有固定值大小的float字符串

SELECT * FROM SAMPLE_TABLE WHERE MAIN_ID = 'SomeVal' ORDER BY OBJ_ID ASC

在上述SQL中,用于过滤关联行的MAIN_ID和 OBJ_ID SAMPLE_TABLE 的主键,其中OBJ_ID是一串固定大小的浮点数,格式为999999.9999,但是当我尝试使用 TO_NUMBER(OBJ_ID)而不是 OBJ_ID 时,它显示无法进行转换。因此,我保持上述操作,并按照使用float的方式对结果进行排序。

我的问题是

  1. ORDER BY OBJ_ID和ORDER BY TO_NUMBER(OBJ_ID)将导致 结果的顺序不同?

  2. 如果是这样,除了 TO_NUMBER 以外,还有其他解决方案吗? 可以满足正确格式的字符串,例如999999.9999和 哪些不在同一查询中?

    例如,行OBJ_ID具有以下值 181001.2122、181001.2123、181001.2143,abcd,abc.efg 最后两个值是代表被拒绝的意外值 条目,有什么方法可以编写单个sql来正确排序前三个float,它们实际上是格式为“ 999999.9999”

  3. 的字符串

3 个答案:

答案 0 :(得分:2)

字符串/ varchar的排序(比较)与数字的排序(比较)不同。

以数字2<11,以字符串/ varchar "2">"11"

假设您对ASC进行了排序,如果您不转换为数字,则在id =“ 11”的行之后有“ 2”的行,如果转换为数字,则反之亦然

答案 1 :(得分:1)

字符串排序更为复杂,数据库可以为此使用各种方法。 https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch5lingsort.htm

with src as (
select '1' x from dual
union 
select '2' from dual
union
select '10' from dual)
select x from src order by x;


with src as (
select '1' x from dual
union 
select '2' from dual
union
select '10' from dual)
select x from src order by to_number(x);

lpad解决方案

with src as (
select '1' x from dual
union 
select '2' from dual
union
select '10' from dual)
select x from src order by lpad(x,10,'0');

答案 2 :(得分:0)

正如克里斯蒂安·基卡(Kristjan Kica)回答的那样,使用varchar可以对varchar进行排序,从而可以得到字母顺序。如果按数字排序,则会得到数字顺序。