Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL查询以获取已从字符串转换为整数的列的最大值_Sql_Oracle - Fatal编程技术网

Oracle SQL查询以获取已从字符串转换为整数的列的最大值

Oracle SQL查询以获取已从字符串转换为整数的列的最大值,sql,oracle,Sql,Oracle,在我的数据库中的一个表中,有一个主要由数字组成的varchar2列。现在我想得到该列的最大数值,忽略非数值。 我该怎么做? 谢谢。您需要确定数字是否为数字。正整数有一种方法: select max(case when LENGTH(TRIM(TRANSLATE(string1, ' 0123456789', ' '))) is null then cast(string1 as integer) end) . . . 如果您有其他数字格式(

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

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

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'
'…'
之类的字符串将通过此测试。

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

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'
'…'
这样的字符串将通过此测试。

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

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条件下使用它。

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

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;
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       

然后你可以在任何地方使用它。

可能有人也知道MySQL的解决方案吗?可能有人也知道MySQL的解决方案吗?但不适用于
1234.0
-567
等。但不适用于
1234.0
-567
等。
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