Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL无效数字_Sql_Oracle_Ora 01722 - Fatal编程技术网

SQL无效数字

SQL无效数字,sql,oracle,ora-01722,Sql,Oracle,Ora 01722,1) 当我在下面运行查询时,DB抛出一个SQL错误,即 “无效号码” 2) 但当我在like运算符中使用(0-10)以外的任何值时,DB不会抛出任何错误 SELECT b.col1,b.col2 FROM table b WHERE b.col1=123 AND b.col2 like '%59%' 将VARCHAR2转换为int时,col1和col2都是VARCHAR2错误 你应该写 SELECT b.col1,b.col2 FROM table b WHERE b.col1='123' A

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

“无效号码”

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

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

将VARCHAR2转换为int时,
col1
col2
都是
VARCHAR2
错误

你应该写

SELECT b.col1,b.col2 FROM table b WHERE b.col1='123' AND b.col2 like '%0%'
表的col1可能包含0-10的前导或尾随空格。此操作失败:

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'

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

即使您正在执行一个完整的表扫描,其中每一行都会被测试,以查看谓词对于它是否都为真,谓词也会一次测试一个。通常,优化程序会首先尝试执行消耗较少资源(主要是CPU)的谓词,如果该谓词为false,则不需要执行其他谓词

在这种情况下:

  • 您将得到一个完整的表扫描,但是col2上的类似操作总是首先执行,因为它没有涉及隐式数据格式转换(猜测1),或者因为优化程序认识到它可能抛出您看到的类型的错误(猜测2),或者
  • 您将对col2进行索引扫描(老实说,这似乎不太可能),然后只访问满足该条件的行,并对col1上的谓词进行求值
  • 无论哪种方式,col2谓词为true的行中似乎没有一行的col1值不能隐式转换为数字

    你当然应该做的是:

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

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

    “col1和col2都是
    VARCHAR2
    ”,那么在比较这两个列时,您应该使用
    '
    其中b.col1='123'和b.col2类似于'%0%。
    感谢您的快速响应。但我的问题是,为什么在查询“从表b中选择b.col1,b.col2,其中b.col1=123,b.col2类似于“%59%”时,我们没有得到除(0-10)之外的SQL错误,我的注释可以很好地作为解释。可能有些行的
    col2(如“%0%”)和
    col1
    不是数字。因此,整个
    ,其中
    失败。您是否尝试使用我发布的查询更改查询?是的,我尝试了您在发布问题之前建议的查询。在col1中使用“”时,它正在工作。但非常奇怪的是,这个查询是如何工作的“从表b中选择b.col1,b.col2,其中b.col1=123,b.col2类似于“%59%””,而不使用“我不明白,所以在发布问题之前,您实际上知道失败的原因是什么?”?。无论如何,我只是给出了一个解释,当使用像“%59%”这样的
    col2时,可能得到的col1结果都是数字
    
    WHERE b.col1='123' AND b.col2 like '%59%'