代码之家  ›  专栏  ›  技术社区  ›  Amutheezan

ORDER BY(VARCHAR)和ORDER BY TO\ U NUMBER(VARCHAR)之间的差异

  •  3
  • Amutheezan  · 技术社区  · 6 年前

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

    在上面的SQL中,MAIN\u ID用于过滤关联的行和 对象ID 是的主键 ,其中OBJ\u ID是一个固定大小的浮点数字符串,格式为999999.9999,但是当我尝试 收件人号码(对象ID) 对象ID 显示无法进行转换。所以我像上面一样运行并得到结果排序,就像使用float时它是如何排序的。

    我的问题是,

    1. 结果顺序不同?

    2. 如果是这样的话,有没有其他的解决办法 收件人号码 哪一个 可以满足像999999.9999和

      例如,行OBJ\u ID具有以下值 181001.2122、181001.2123、181001.2143、abcd、abc.efg 其中最后两个值是表示拒绝的意外值

    3 回复  |  直到 6 年前
        1
  •  2
  •   kkica    6 年前

    string/varchar的排序(比较)不同于数字的排序(比较)。

    2<11 ,在字符串/varchar中 "2">"11"

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

        2
  •  1
  •   Arkadiusz Łukasiewicz    6 年前

    字符串排序更为复杂,数据库可以使用各种方法进行排序。 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');
    
        3
  •  0
  •   Antonio    6 年前