在下面的两个查询集中,它将与同一组值相同,其中在一种情况下,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的方式对结果进行排序。
我的问题是
ORDER BY OBJ_ID和ORDER BY TO_NUMBER(OBJ_ID)将导致 结果的顺序不同?
如果是这样,除了 TO_NUMBER 以外,还有其他解决方案吗? 可以满足正确格式的字符串,例如999999.9999和 哪些不在同一查询中?
例如,行OBJ_ID具有以下值 181001.2122、181001.2123、181001.2143,abcd,abc.efg 最后两个值是代表被拒绝的意外值 条目,有什么方法可以编写单个sql来正确排序前三个float,它们实际上是格式为“ 999999.9999”
答案 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进行排序,从而可以得到字母顺序。如果按数字排序,则会得到数字顺序。