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%'
col1
和col2
都是VARCHAR2
答案 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,则不需要执行其他谓词。
在这种情况下:
无论哪种方式,似乎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'