我在Oracle中对两个数字进行了比较。010和10。就数值相等而言,它们是相等的;但是,我需要将它们作为字符串进行比较。我尝试过to_char,但它不起作用。
有没有其他函数可以让我将数值作为字符串进行精确的比较?
-澄清每个人的疑问
我有三个列address1、address2和address3,我只想比较这三个列连接的数字。例如,如果值如下所示:
address1 = 01公园大道
address2 = 20金门
address3 = null
然后我想比较表中的数据,看看是否有任何地址的串联值为0120
然而,现在它等于120,也等于0120,这不是我想要的。
数据是提取并连接起来的,所以不会存储在某种类型的列中。我所需要的是确保这些数字被“准确”地比较,而不是作为数字进行比较。
请提个建议。
干杯
发布于 2009-10-07 06:09:02
您在这里实际上没有选择-您要么比较字符串-要么比较数字。
The "strings":
"10"
"010"
"0010"
"00010"
转换为Integer all = 10时。
如果你从一个整数10开始,你无法知道它的“字符串”版本应该有多少个前导零。因此,将它们全部存储为字符串,或者将它们作为数字进行比较-意思是" 10“= "010”= "0010“=10。
发布于 2009-10-07 09:47:22
这就是你要找的吗?
设置一些示例数据:
create table address as
select
'01 park avenue' address1,
'20 golden gate' address2,
'30 test' address3
from
dual;
insert into address
select
'01 park avenue' address1,
'20 golden gate' address2,
null address3
from
dual;
insert into address
select
'01 park avenue' address1,
'20 golden gate' address2,
null address3
from
dual;
commit;
这是一个查询,它将通过按连接的数字字符串排序来查找“重复项”。我们在地址连接上使用regexp_replace从地址中提取数字。
select
address1 || address2 || address3 address_concat,
regexp_replace(address1 || address2 || address3, '[^[:digit:]]')
address_numbers_only
from
address
order by
address_numbers_only;
如果您正在查找与特定地址匹配的地址,请尝试如下所示:
select
*
from
address
where
regexp_replace(address1 || address2 || address3, '[^[:digit:]]') =
regexp_replace(:v_address1 ||
:v_address2 ||
:v_address3, '[^[:digit:]]');
例如:
select
*
from
address
where
regexp_replace(address1 || address2 || address3, '[^[:digit:]]') =
regexp_replace('01 park avenue' ||
'20 golden gate' ||
null, '[^[:digit:]]');
-- returns...
ADDRESS1 ADDRESS2 ADDRESS3
01 park avenue 20 golden gate
01 park avenue 20 golden gate
发布于 2009-10-07 11:49:02
检查精确匹配的唯一正确方法是
select whatever
from addresses
where address1 = '01'
and address2 = '20'
and address3 is null;
(用绑定变量或其他列替换硬编码的值)。
忽略这个显而易见的解决方案的事实表明,您有一些动机来比较连接的字符串,这一点您还没有解释。
正如您正在发现的,通过连接进行匹配是很麻烦的。如果所有元素都被填充并且具有固定的长度,它就可以工作。一旦我们允许空值或可变长度值,我们就完蛋了。以下内容都不应该在元素相等的基础上进行匹配,但是请注意!通过连接的魔力,他们做到了:
SQL> select * from dual
2 where 1||23 = 12||3
3 /
D
-
X
SQL> select * from dual
2 where 1||null||2 = 1||2||null
3 /
D
-
X
SQL>
SQL> select * from dual
2 where 123||null||null = 1||2||3
3 /
D
-
X
SQL>
此问题的解决方法是显式界定连接字符串中的元素。例如,如果我们用波浪号分隔最后一个例子中的元素,我们将不再得到匹配...
SQL> select * from dual
2 where 123||'~'||null||'~'||null = 1||'~'||2||'~'||3
3 /
no rows selected
SQL>
https://stackoverflow.com/questions/1529745
复制相似问题