SQL无效的数字

时间:2015-08-18 16:32:49

标签: sql oracle ora-01722

1)当我在查询下面运行时,DB会抛出一个SQL错误,即

  

'无效号码'

SELECT b.col1,b.col2 FROM table b WHERE b.col1=123 AND b.col2 like '%0%'

2)但是当我在like运算符中使用(0-10)以外的任何值时,DB不会抛出任何错误

SELECT b.col1,b.col2 FROM table b WHERE b.col1=123 AND b.col2 like '%59%'

col1col2都是VARCHAR2

3 个答案:

答案 0 :(得分:1)

将varchar2转换为int

时出错

你应该写

SELECT b.col1,b.col2 FROM table b WHERE b.col1='123' AND b.col2 like '%0%'

你的col1表可能包含0-10的前导或尾随空格

答案 1 :(得分:1)

虽然在您的查询中col1上的谓词在col2之前列出,但这并不意味着它按此顺序应用于系统。

即使您正在执行全表扫描,其中每行都经过测试以查看谓词是否都是真的,但是谓词一次只能测试一个。通常,优化器将尝试首先执行消耗较少资源(主要是CPU)的谓词,如果该谓词为false,则不需要执行其他谓词。

在这种情况下:

  1. 你正在进行全表扫描,但是col2上的类似总是首先执行,因为它没有涉及隐式数据格式转换(猜测1),或者因为优化器认识到它可能会引发错误你看到的类型(猜2),或......
  2. 您正在col2上进行索引扫描(说实话似乎不太可能),然后只访问符合该条件的行,然后对col1上的谓词进行评估。
  3. 无论哪种方式,似乎col2谓词都不为真的行都没有col1值,不能隐式转换为数字。

    你当然应该做的是:

    WHERE b.col1='123' AND b.col2 like '%59%'
    

    隐式数据转换不是一件好事。

答案 2 :(得分:0)

这失败了:

SELECT b.col1,b.col2 FROM table b WHERE b.col1=123 AND b.col2 like '%0%'

...因为某些像col2这样的行'%0%'的col1值无法转换为数字。

这不会失败:

SELECT b.col1,b.col2 FROM table b WHERE b.col1=123 AND b.col2 like '%59%'

...因为没有像'%59%'那样具有col2的行具有无法转换为数字的col1值。

但是,你在第二种情况下只是幸运。如果col1是VARCHAR2字段,则应将其与字符串进行比较。即,

WHERE b.col1='123'