当oracle db中存在非字符串(即:varchar,date)列(col1)时,如果我这样做:
select * from table order by col1 asc
它订单正常。 (即,对于日期,它从最旧到最新订购,数字,从最低到最高)
但如果我这样做,select * from table order by upper(col1) asc
排序不正确。
这种行为的原因是什么?
答案 0 :(得分:8)
UPPER接受一个字符串并返回一个字符串。如果col1
不是字符串,则必须在执行函数之前将其隐式强制转换为字符串。但是,由于UPPER函数的输出是字符串,因此排序必须使用字符串排序语义,而不是col1
的排序语义。如果col1
是数字,例如
字符串'9'在字符串'10'后按字母顺序排列,这可能是您看到的问题。
但如果col1
不是字符串,为什么要将它转换为大写以便排序?