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

Vic*_*tor 3 sql oracle

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

select * from table order by col1 asc
Run Code Online (Sandbox Code Playgroud)

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

这种行为的原因是什么?

Jus*_*ave 8

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

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

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

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