Swe*_*tha 3 sql oracle ora-01722
我在包中有一个查询抛出错误
ORA-01722 : 号码无效。
我尝试了很多方法但没有运气。
select h.column
from table1 h,table2 c
where c.created_date='17-MAY-17'
and nvl(c.acct_nmbr,0)=nvl(to_number(h.v_acct_num),0)
Run Code Online (Sandbox Code Playgroud)
c.acct_nmbr是属于NUMBER(19,0)h.v_acct_num是属于varchar2(4000 byte)请建议我解决方案
如果您使用的是Oracle 12.2 或更高版本,则可以使用TO_NUMBERwithON CONVERSION ERROR子句,如下所示:
SELECT
H.COLUMN
FROM
TABLE1 H
JOIN TABLE2 C
ON NVL(C.ACCT_NMBR, 0) = NVL(TO_NUMBER(H.V_ACCT_NUM DEFAULT -999 ON CONVERSION ERROR), 0)
-- use any number which is impossible in your column
-- so that it do not match any random records.
WHERE
C.CREATED_DATE = DATE '2017-05-17';
Run Code Online (Sandbox Code Playgroud)
笔记:
DATE无论何时要将字符串转换为日期或TO_DATE函数,都可以使用文字干杯!!
显然v_acct_num列包含非数字值。to_number()函数有一个限制,即参数中的值不应包含任何非数字字符,否则系统会抛出ORA-01722 : invalid number. 如果您确定提取非数字字符时数据匹配,请在's子句regexp_replace(t2.v_acct_num,'[^[:digit:]]')的排序规则内使用:joinon
select t2.column
from table1 t1
join table2 t2 on nvl(t1.acct_nmbr,0) = nvl(regexp_replace(t2.v_acct_num,'[^[:digit:]]'),0)
where t2.created_date = date'2017-05-17'
Run Code Online (Sandbox Code Playgroud)
使用ANSI-92标准 forJoin和ISO-8601标准 fordate语法。
| 归档时间: |
|
| 查看次数: |
20145 次 |
| 最近记录: |