Oracle SQL MAX函数在VARCHAR到NUMBER转换时没有返回最大值

时间:2014-11-04 15:51:19

标签: sql oracle

我试图从一组行中获取最高的系统编号。系统编号前面有SYS,因此select SYSTEM_ID from TABLE会产生{SYS901,SYS87,SYS3024.....}

这是我试图使用的查询:

select MAX(REPLACE(SYSTEM_ID,'SYS','')) from TABLE

可能的结果是

{901,87,3024,20,1}

它返回901值,我希望看到3024值。我认为问题是该字段是VARCHAR而不是NUMBER。如何解决这个问题,我不知道。

3 个答案:

答案 0 :(得分:11)

select MAX(TO_NUMBER(REPLACE(SYSTEM_ID,'SYS',''))) from TABLE;

使用TO_NUMBER将VARCHAR2转换为NUMBER,否则Oracle会使用ASCII代码比较字符串(''>' 3')

答案 1 :(得分:5)

当然它正在返回最大值。它只是根据字符串比较的规则返回最大值,而不是数字。

要获取数字最大值,请执行转换:

select MAX(TO_NUMBER(REPLACE(SYSTEM_ID, 'SYS', ''))) from TABLE

答案 2 :(得分:0)

如果您的表格中有值'SYS5001B',您可能需要考虑进行“安全”号码转换:

SELECT MAX( TO_NUMBER( COALESCE( REGEXP_SUBSTR( system_id, '\d+' ), '0' ) ) )
  FROM table