即使从子查询中删除varchar值也是如此

时间:2014-12-22 06:33:22

标签: sql sql-server-2008

今天早上我遇到了一种奇怪的行为,我不确定为什么会这样? 我的表和价值观:

create table tblA (acc varchar(10),accname varchar(10))

insert into tblA values('1','A')
insert into tblA values('2','B')
insert into tblA values('3','C')
insert into tblA values('Z','D')
insert into tblA values('4','E')

查询1以获取1的

select * from tblA where acc = 1
error : Conversion failed when converting the varchar value 'Z' to data type int

我非常了解错误。

查询2以获取所有数字记录

select * from tblA where ISNUMERIC(acc)<>0

给我所有带有正确数字帐户的记录。不包括acc&#39; Z&#39;

查询3以从所有数字accs

中获取acc 1
select * from (select * from tblA where ISNUMERIC(acc)<>0) A 
where A.acc=1
error : Conversion failed when converting the varchar value 'Z' to data type int.

这是我不明白的,它是如何显示价值的错误&#39; Z&#39;从子查询别名为A的表中甚至不存在?我知道有转换或转换为varchar和所有的工作,我只是想知道这种行为背后的原因

3 个答案:

答案 0 :(得分:0)

您的数据类型为Id acc as varchar,您正在检查acc为整数类型。只需将acc作为varchar传递。

select * from (select * from tblA where ISNUMERIC(acc)<>0) A 
where A.acc='1'

这样可以正常工作。

这是参考的屏幕截图 enter image description here

答案 1 :(得分:0)

您在查询3中的转换是一个过滤谓词,这意味着它正在执行检查以返回acc可以转换为数字的所有行。但是,它不会返回带有转换值的结果集,如下所示:

select * 
from (select CONVERT(INT, acc) AS acc, accname
      from tblA 
      where ISNUMERIC(acc)<>0) A 
where A.acc=1

换句话说,您的查询仍然返回varchars,而不是整数。因此,可能是在幕后,查询引擎只是对表中的每个值进行转换,因为如果它估计它会更快,它将不会简单地遵循查询的顺序。因此,即使您在逻辑上已经排除了对非整数值执行整数转换的需要,查询优化器仍然在后台执行它,因为它认为它将节省时间。这只是我的推测。

答案 2 :(得分:0)

尝试以下嵌套案例查询

select * from #tblA where 1= case when ISNUMERIC(acc)=1 then case when acc=1 then 1 end end