Как использовать между условием с числами для строковых столбцов в Oracle

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

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

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 выглядит так:

Как использовать между условием с числами для строковых столбцов в Oracle

Не могли бы вы предоставить некоторые образцы данных? почему вы будете использовать значение номера хранилища строкового типа в столбце emp_number?

D-Shih 22.01.2019 09:07

Не используйте схему SYS для собственных данных. SYS (и SYSTEM) особенные, оставьте их в покое. Если вы сделаете что-то непредвиденный, вы можете уничтожить базу данных. Создайте другого пользователя и делайте там все, что делаете.

Littlefoot 22.01.2019 09:12
НИКОГДА, Когда-либо создавать собственные таблицы в схеме SYS или SYSTEM. Создайте обычного пользователя и создайте там свои таблицы. Использует ли НЕТSYS или SYSTEM для своего приложения или что-либо еще, кроме выполнения работы DBA. Просто не
a_horse_with_no_name 22.01.2019 09:53

Моя колонка будет такой

madhan 22.01.2019 13:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
4
592
3

Ответы 3

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

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

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. Пожалуйста, помогите мне решить проблему

madhan 22.01.2019 11:24

Правильное решение - хранить числа как числа. Остальные - просто обходные пути. Вы можете попробовать использовать более эффективное регулярное выражение, например. CASE WHEN REGEXP_LIKE(emp_number, '^\d{1,10}$') THEN TO_NUMBER... или добавьте другой фильтр, например. WHERE emp_number BETWEEN '0' AND '9' AND CASE .... Или используйте решение on conversion error в другом ответе.

Salman A 22.01.2019 11:52

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

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

или:

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

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

Спасибо за предложение, но когда я использую одно условие, оно возвращает значение, но при использовании двух условий ничего не возвращается. Также что, если сравнение между «100» и «1000»

madhan 22.01.2019 13:25

Другие вопросы по теме