我有一个表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-“无效编号” *原因:指定的号码无效。 *操作:指定一个有效的数字。
答案 0 :(得分: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 |