Oracle-SQL Query获取已从String转换为Integer的列的最大值

时间:2014-01-17 14:08:46

标签: sql oracle

在我的数据库中的表中,有一个varchar2列,主要由数字组成。现在我想要接收该列的NUMERICAL最大值,忽略非数值。 我怎么做? 谢谢。

3 个答案:

答案 0 :(得分:3)

当您尝试将字符串转换为数字时,有很多陷阱和异常。我使用这样的函数:

FUNCTION Is_Numeric(Expression IN VARCHAR2) RETURN INTEGER
BEGIN
   IF TO_NUMBER(Expression) IS NOT NULL THEN
      RETURN 1;
   ELSE
      RETURN 0;   
   END IF;    
EXCEPTION
   WHEN VALUE_ERROR OR INVALID_NUMBER THEN
      RETURN 0; 
END Is_Numeric;

然后你可以在任何WHERE条件下使用它。

答案 1 :(得分:1)

您需要确定该数字是否为数字。这是正整数的一种方法:

select max(case when LENGTH(TRIM(TRANSLATE(string1, ' 0123456789', ' '))) is null
                then cast(string1 as integer)
           end)
. . .

如果您有其他数字格式(浮点数,负值,指数),那么可以为这些格式添加适当的测试。

顺便说一句,网上充满了建议,使用类似的东西:

LENGTH(TRIM(TRANSLATE(myfield, ' +-.0123456789', ' '))) is null

请注意,因为'1+1''...'等字符串会通过此测试。

答案 2 :(得分:1)

SQL> select * from t;

X                                                                               
----------                                                                      
1234                                                                            
836                                                                             
836AA%%$$                                                                       
BBcdfrg                                                                         
12099                                                                           

SQL> select max(to_number(x)) from t
  2  where trim(translate(x,'0123456789',' ')) is null
  3  /

MAX(TO_NUMBER(X))                                                               
-----------------                                                               
            12099