Как использовать между условием с числами для строковых столбцов в Oracle - PullRequest
0 голосов
/ 22 января 2019

Мне нужно проверить условие между двумя числами в таблицах, но столбец в oracle DB содержит строковые значения.

Я попробовал следующий запрос, мне ничего не помогло

select * from  sys.employee_infor where  to_number(emp_number) between 1200 and 2400;

select * from  sys.employee_infor where (emp_number) >= to_char(1200) and (emp_number)  <= to_char(2400);

select * from  sys.employee_infor where  to_number(emp_number) between '1200' and '2400';

Полученная ошибка как:

ORA-01722: неверный номер

Мой столбец Emp_number будет как,

enter image description here

Ответы [ 3 ]

0 голосов
/ 22 января 2019

более безопасное решение - CASE:

SELECT *
FROM sys.employee_infor
WHERE CASE WHEN NOT REGEXP_LIKE(emp_number, '\D') THEN TO_NUMBER(emp_number) END BETWEEN 1200 AND 2400
0 голосов
/ 22 января 2019

Во многих случаях это будет работать:

where emp_number >= '1200' and emp_number <= '2400'

или:

where emp_number >= '1200' and emp_number <= '2400' and
      length(emp_number) = 4

Это не совсем то же самое, потому что он использует сравнения строк, а не числовые сравнения.С другой стороны, он может использовать индексы.

0 голосов
/ 22 января 2019

Возможно, в столбце номеров сотрудников имеются данные, которые невозможно преобразовать в число.

Предполагая, что номер сотрудника является целочисленным значением, следующий запрос покажет вам ошибочные строки:

select * from sys.employee_infor where regexp_like(emp_number, '[^0-9]');

Вы можете использовать предложение where в своем запросе, чтобы игнорировать плохо отформатированные данные:

select * from (
    select * from sys.employee_infor where not regexp_like(emp_number, '[^0-9]')
) where  to_number(emp_number) between 1200 and 2400

PS: вы хотите сравнивать числа, а не строки.

Другое решение заключается в использовании опции DEFAULT ... ON CONVERSION ERROR функции TO_NUMBER(), которая доступна начиная с Oracle 12c R2. С этой опцией ошибки преобразования перехватываются, и вместо выдачи ошибки возвращается значение по умолчанию:

select * 
from sys.employee_infor 
where to_number(emp_number default 0 on conversion error) between 1200 and 2400
...