ORACLE 获取varchar2字段范围内的较大值和较小值

ORACLE Obtain the greater and lower value in a varchar2 field range

我有一个 table 字段类型为 varchar2,

假设这个值:

aaab
s123
2445
25
21000
2500000
1
10000790
1899

我需要获取以2开头的更大的值。

我正在尝试:

Select TO_NUMBER(myfield) from Services where myfield like '2%';

我明白了

2445
25
21000
2500000

现在,我想获得更大和更小的值252500000

我正在尝试:

Select TO_NUMBER(myfield) from Services where myfield like '2%' ORDER BY myfield DESC;

Select MAX(TO_NUMBER(myfield)) from Services where myfield like '2%';

Select MIN(TO_NUMBER(myfield)) from Services where myfield like '2%';

我得到:

01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.

无论该行是否是结果集的一部分,Oracle 都会执行大多数函数调用。为确保仅针对结果集的值调用该函数,请将 where 条件放在子查询中:

Select TO_NUMBER(myfield) 
  from (SELECT * from Services where myfield like '2%')
 ORDER BY 1 DESC

如果您不确定,table 的每个值都是一个数字,最好编写您自己的 pl/sql 函数:

CREATE FUNCTION my_to_number(val IN VARCHAR2) RETURN NUMBER IS
BEGIN 
  RETURN TO_NUMBER(val);
EXCEPTION
  WHEN VALUE_ERROR THEN 
    RETURN NULL;
END;

然后使用此函数获取您的值:

Select MY_TO_NUMBER(myfield) 
  from Services where myfield like '2%'
 ORDER BY 1 DESC

您需要验证所有数字都是 number/digits。

包括此验证

 SELECT * FROM Services WHERE myfield LIKE '2%' AND REGEXP_LIKE (myfield, '^[[:digit:]]+$')

获取最大值和最小值

SELECT MAX(TO_NUMBER(myfield)), MIN(TO_NUMBER(myfield))
from (SELECT * FROM Services WHERE myfield LIKE '2%' AND REGEXP_LIKE (myfield, '^[[:digit:]]+$'))

现在,继Radagast81之后,

SELECT TO_NUMBER(myfield)
    from (SELECT * FROM Services WHERE myfield LIKE '3%' AND REGEXP_LIKE (myfield, '^[[:digit:]]+$'))
ORDER BY 1 DESC;