0

1)当我在查询下运行时,数据库抛出一个 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_col2VARCHAR2

4

3 回答 3

1

将 varchar2 转换为 int 时出错

你应该写

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

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

于 2015-08-18T16:43:38.560 回答
1

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

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

在这种情况下:

  1. 您正在进行全表扫描,但 col2 上的类似总是首先执行,因为其中不涉及隐式数据格式转换(猜测 1),或者因为优化器认识到它可能会引发您类型的错误重新看到(猜测2),或...
  2. 您正在对 col2 进行索引扫描(老实说,这似乎不太可能),然后只有满足该条件的行才会被访问,然后 col1 上的谓词对其进行评估。

无论哪种方式,似乎 col2 谓词为真的行都没有 col1 的值,该值不能隐式转换为数字。

你当然应该做的是:

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

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

于 2015-08-18T21:27:12.130 回答
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 字段,则应将其与字符串进行比较。IE,

WHERE b.col1='123'
于 2015-08-18T21:11:10.803 回答