今天早上我遇到了一种奇怪的行为,我不确定为什么会这样? 我的表和价值观:
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 1select * 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和所有的工作,我只是想知道这种行为背后的原因
答案 0 :(得分:0)
您的数据类型为Id acc as varchar,您正在检查acc为整数类型。只需将acc作为varchar传递。
select * from (select * from tblA where ISNUMERIC(acc)<>0) A
where A.acc='1'
这样可以正常工作。
这是参考的屏幕截图
答案 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