Oracle将varchar2字段与数字进行比较

时间:2012-10-05 15:29:43

标签: sql oracle

我有一个查询,其中我有以下子查询

(select account from asl_data where alias_accunt = trim(field) )

其中alias_account是varchar2(20),而字段值来自另一个子查询的substr。但是价值来自00123456789

为此,我收到错误为无效号码。我尝试了to_char,在两个字段上强制转换函数。但似乎没有任何效果。

我错过了什么?有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

在此查询/过程的某处,尝试将字符串隐式转换为数字。可能在您的子查询中,或者可能是因为变量声明是您的一个变量的数字。你发布的例子似乎没有错。

识别字段后,您可以使用此类查询查看导致此问题的行。

with t1 as 
(
    select '100' id1, 'first' name1 from dual
    union all
    select '100A' id1, 'second' name1 from dual
    union all
    select '$$1' id1, 'third' name1 from dual
)
select * from t1

100    first
100A   second
$$1    third

如果你试图将id转换为数字,第一个会起作用(可能是你的例子就是这种情况),但其他人会引起错误。

with t1 as
(
    select '100' id1, 'first' name1 from dual
    union all
    select '100A' id1, 'second' name1 from dual
    union all
    select '$$1' id1, 'third' name1 from dual
)
select id1,
       name1,
       to_number(id1)
   from t1

/

ERROR:
ORA-01722: invalid number

要识别出现此问题的行,请使用...

with t1 as 
(
    select '100' id1, 'first' name1 from dual
    union all
    select '100A' id1, 'second' name1 from dual
    union all
    select '$$1' id1, 'third' name1 from dual
)
select id1, 
       name1
       --,replace( translate( id1, '0123456789', '0000000000' ), '0', '' ),
       --length(replace( translate( id1, '0123456789', '0000000000' ), '0', '' ))
   from t1
   where length(replace( translate( id1, '0123456789', '0000000000' ), '0', '' )
               ) <> 0

id1     name1
---------------
100A    second
$$1     second