ORACLE Получите большее и меньшее значение в диапазоне полей varchar2 - PullRequest
0 голосов
/ 29 октября 2018

У меня есть таблица с полем типа 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

Теперь я хочу получить, чем больше и меньше значения 25 и 2500000.

Я пытался с:

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.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вам необходимо проверить, чтобы все цифры были числами / цифрами.

Включить эту проверку

 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:]]+$'))

Теперь, следуя Радагасту81,

SELECT TO_NUMBER(myfield)
    from (SELECT * FROM Services WHERE myfield LIKE '3%' AND REGEXP_LIKE (myfield, '^[[:digit:]]+$'))
ORDER BY 1 DESC;
0 голосов
/ 29 октября 2018

Oracle выполняет большинство вызовов функций независимо от того, является ли строка частью набора результатов или нет. Чтобы функция вызывалась только для значений результирующего набора, поместите условие where в подзапрос:

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

Если вы не уверены, что каждое значение вашей таблицы является числом, лучше написать свою собственную функцию 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
...