#sql #oracle
#sql #Oracle
Вопрос:
У меня есть таблица, скажем, table_Test, которая содержит некоторые тестовые значения, и в ней есть столбец с типом varchar с именем say Value. Некоторые примерные значения в столбце value похожи ‘5.5’, ‘>7.2’, ‘>3.6’ и т.д. Единственными возможными нечисловыми символами в значениях являются ‘<‘ и ‘>’.
Теперь требуется извлекать данные из этой таблицы со значением, превышающим, скажем, 5. Я попытался преобразовать значение в числовое перед сравнением с приведенным ниже запросом:
SELECT *
FROM table_test
WHERE to_number(TRIM(translate(value,'<>',' ') ) ) >= 5
Этот запрос работает абсолютно нормально. Однако, когда я выполняю самосоединение для включения других условий в мое требование, приведенный ниже запрос завершается ошибкой.
SELECT res1.client_id,
res1.value,
res1.test_date
FROM table_test res1,
table_test res2
WHERE res1.client_id = res2.client_id
AND res1.lab_sample_source_id = 1
AND res2.lab_sample_source_id = 2 AND res2.lab_method_id = 52
AND to_number(TRIM(translate(res1.value,'<>',' ') ) ) >= 5
AND to_number(TRIM(translate(res1.value,'<>',' ') ) ) < 10
Запрос завершается ошибкой:
ORA-01722: недопустимый номер 01722. 00000 — «недопустимый номер» * Причина: указанный номер был недопустимым. * Действие: Укажите допустимое число.
Комментарии:
1. ИМО, вам следует прокомментировать
and to_number(...) <10
условие и снова выполнить свой запрос. Это должно снова вызвать ту же ошибку.2. Это означает, что в некоторых строках есть другие символы, кроме
><
. Первый запрос работает только для первых нескольких строк, которые отображаются на экране.3. Пожалуйста, предоставьте примеры данных и желаемые результаты. Мне не ясно, что вы хотите вернуть.
4. @Kaushik Там нет других символов, кроме >< . иначе первый запрос не сработал бы правильно?
5. @Gordon, я предоставил примеры значений для столбца value. Первый запрос работает, однако то же условие при самостоятельном соединении не работает.
Ответ №1:
Здесь помогло бы регулярное выражение. Используйте для этого функцию REGEXP_REPLACE.
create table table_test
(
value varchar2(20)
);
insert into table_test values ('>7.2');
insert into table_test values ('5.5');
insert into table_test values ('>3.6');
commit;
select
value,
regexp_replace(value,'[0-9.]') as characters,
regexp_replace(value,'[^0-9.]') as numbers
from table_test
where to_number(regexp_replace(value,'[^0-9.]')) >= 5;
| VALUE | CHARACTERS | NUMBERS |
|-------|------------|---------|
| >7.2 | > | 7.2 |
| 5.5 | (null) | 5.5 |
Комментарии:
1. будет ли это работать для самостоятельного объединения? для одного запроса мой первый запрос работает.
2. Пока вы соответствуете выражению типов данных (например, число X = число Y), все должно быть в порядке. Всегда указывайте типы данных явно. Поэтому используйте
to_number
,to_char
илиto_date
вместо неявного преобразования типов данных.