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