Мне нужно проверить условие между двумя числами в таблицах, но столбец в базе данных оракула имеет строковые значения.
Я попробовал следующий запрос, мне ничего не помогло
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: invalid number
Мой столбец Emp_number выглядит так:
Не используйте схему SYS для собственных данных. SYS (и SYSTEM) особенные, оставьте их в покое. Если вы сделаете что-то непредвиденный, вы можете уничтожить базу данных. Создайте другого пользователя и делайте там все, что делаете.
SYS или SYSTEM. Создайте обычного пользователя и создайте там свои таблицы. Использует ли НЕТSYS или SYSTEM для своего приложения или что-либо еще, кроме выполнения работы DBA. Просто не
Моя колонка будет такой


Вероятно, у вас есть данные в столбце с номером сотрудника, которые нельзя преобразовать в число.
Предполагая, что номер сотрудника является целым числом, следующий запрос покажет вам ошибочные строки:
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
более безопасное решение должен использовать 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
REGEXP_LIKE занимает много времени для выполнения запроса, мне нужно включить этот подзапрос в основной запрос, а Sys — это просто пример, имя пользователя отличается от sys. Пожалуйста, помогите мне решить проблему
Правильное решение - хранить числа как числа. Остальные - просто обходные пути. Вы можете попробовать использовать более эффективное регулярное выражение, например. CASE WHEN REGEXP_LIKE(emp_number, '^\d{1,10}$') THEN TO_NUMBER... или добавьте другой фильтр, например. WHERE emp_number BETWEEN '0' AND '9' AND CASE .... Или используйте решение on conversion error в другом ответе.
Во многих случаях это будет работать:
where emp_number >= '1200' and emp_number <= '2400'
или:
where emp_number >= '1200' and emp_number <= '2400' and
length(emp_number) = 4
Это не совсем то же самое, потому что используется сравнение строк, а не числовое сравнение. С другой стороны, он может использовать индексы.
Спасибо за предложение, но когда я использую одно условие, оно возвращает значение, но при использовании двух условий ничего не возвращается. Также что, если сравнение между «100» и «1000»
Не могли бы вы предоставить некоторые образцы данных? почему вы будете использовать значение номера хранилища строкового типа в столбце
emp_number?