首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在oracle中将数字作为字符串进行比较

在oracle中将数字作为字符串进行比较
EN

Stack Overflow用户
提问于 2009-10-07 05:57:27
回答 5查看 6.3K关注 0票数 0

我在Oracle中对两个数字进行了比较。010和10。就数值相等而言,它们是相等的;但是,我需要将它们作为字符串进行比较。我尝试过to_char,但它不起作用。

有没有其他函数可以让我将数值作为字符串进行精确的比较?

-澄清每个人的疑问

我有三个列address1、address2和address3,我只想比较这三个列连接的数字。例如,如果值如下所示:

address1 = 01公园大道

address2 = 20金门

address3 = null

然后我想比较表中的数据,看看是否有任何地址的串联值为0120

然而,现在它等于120,也等于0120,这不是我想要的。

数据是提取并连接起来的,所以不会存储在某种类型的列中。我所需要的是确保这些数字被“准确”地比较,而不是作为数字进行比较。

请提个建议。

干杯

EN

回答 5

Stack Overflow用户

发布于 2009-10-07 06:09:02

您在这里实际上没有选择-您要么比较字符串-要么比较数字。

代码语言:javascript
复制
The "strings":
"10"
"010"
"0010"
"00010"

转换为Integer all = 10时。

如果你从一个整数10开始,你无法知道它的“字符串”版本应该有多少个前导零。因此,将它们全部存储为字符串,或者将它们作为数字进行比较-意思是" 10“= "010”= "0010“=10。

票数 1
EN

Stack Overflow用户

发布于 2009-10-07 09:47:22

这就是你要找的吗?

设置一些示例数据:

代码语言:javascript
复制
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从地址中提取数字。

代码语言:javascript
复制
select
    address1 || address2 || address3 address_concat,
    regexp_replace(address1 || address2 || address3, '[^[:digit:]]')
            address_numbers_only
from
    address
order by
    address_numbers_only;

如果您正在查找与特定地址匹配的地址,请尝试如下所示:

代码语言:javascript
复制
select
    *
from
    address
where
    regexp_replace(address1 || address2 || address3, '[^[:digit:]]') = 
            regexp_replace(:v_address1 ||
                    :v_address2 || 
                    :v_address3, '[^[:digit:]]');

例如:

代码语言:javascript
复制
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  
票数 1
EN

Stack Overflow用户

发布于 2009-10-07 11:49:02

检查精确匹配的唯一正确方法是

代码语言:javascript
复制
select whatever
from addresses
where address1 = '01'
and   address2 = '20'
and   address3 is null;

(用绑定变量或其他列替换硬编码的值)。

忽略这个显而易见的解决方案的事实表明,您有一些动机来比较连接的字符串,这一点您还没有解释。

正如您正在发现的,通过连接进行匹配是很麻烦的。如果所有元素都被填充并且具有固定的长度,它就可以工作。一旦我们允许空值或可变长度值,我们就完蛋了。以下内容都不应该在元素相等的基础上进行匹配,但是请注意!通过连接的魔力,他们做到了:

代码语言:javascript
复制
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>

此问题的解决方法是显式界定连接字符串中的元素。例如,如果我们用波浪号分隔最后一个例子中的元素,我们将不再得到匹配...

代码语言:javascript
复制
SQL> select * from dual
  2  where 123||'~'||null||'~'||null = 1||'~'||2||'~'||3
  3  /

no rows selected

SQL>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1529745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档