在联接查询中与varchar列进行数字比较

时间:2019-04-01 02:05:30

标签: sql oracle

我有一个表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 个答案:

答案 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;

Demo

| VALUE | CHARACTERS | NUMBERS |
|-------|------------|---------|
|  >7.2 |          > |     7.2 |
|   5.5 |     (null) |     5.5 |