Сравнение чисел со столбцами varchar в запросе соединения - PullRequest
1 голос
/ 01 апреля 2019

У меня есть таблица скажем table_Test, которая содержит некоторые тестовые значения, и у нее есть столбец с типом varchar с именем say 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 Ответ

1 голос
/ 01 апреля 2019

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