按上限(colname)的Oracle顺序不能为非字符串列提供正确的结果

时间:2011-02-09 16:36:17

标签: sql oracle

当oracle db中存在非字符串(即:varchar,date)列(col1)时,如果我这样做:

select * from table order by col1 asc

它订单正常。 (即,对于日期,它从最旧到最新订购​​,数字,从最低到最高) 但如果我这样做,select * from table order by upper(col1) asc 排序不正确。

这种行为的原因是什么?

1 个答案:

答案 0 :(得分:8)

UPPER接受一个字符串并返回一个字符串。如果col1不是字符串,则必须在执行函数之前将其隐式强制转换为字符串。但是,由于UPPER函数的输出是字符串,因此排序必须使用字符串排序语义,而不是col1的排序语义。如果col1是数字,例如

  • UPPER(9)返回字符串'9'
  • UPPER(10)返回字符串'10'

字符串'9'在字符串'10'后按字母顺序排列,这可能是您看到的问题。

但如果col1不是字符串,为什么要将它转换为大写以便排序?