2013-05-11 50 views
1

我无法使用单引号选择包含IN子句的值。 pid列是varchar(50)IN运算符未找到匹配项

select * from t_tra_main where pid in (200000002,300000394,200000004, 
    200000001,300000378,300000393,300000379,200000003) 

select * from t_tra_main where pid in ('200000002','300000394','200000004', 
    '200000001','300000378','300000393','300000379','200000003') 

第一个查询返回数据,但第二个查询不返回数据。

+0

down voter's please请添加评论。它将帮助 – 2013-05-11 18:15:59

+1

pid值是否填充了前导零?如果是这样,那就可以解释它。当您使用IN列表使用数字值时,它会隐式地将值(pid)转换为数字,从而消除前导零。 – mroach 2013-05-11 18:19:44

+0

是不是我downvoted。是否=现有ID中的一个工作?适用于我的sql-server 2012,所以只能假设一些奇怪的事情发生,例如奇怪的PID列上的索引,破表(试试DBCC吗?)或者这些值都不在表中。 – 2013-05-11 18:20:21

回答

1

一些实验,我认为表中的值在开始处有空格或零。

对于OP,您可以通过运行下面的查询测试:

select * 
from t_tra_main 
where left(pid) in (' ', '0'); 

的SQL小提琴是here。代码是:

create table t_tra_main (
    id int identity(1, 1), 
    pid varchar(50) 
); 

insert into t_tra_main(pid) 
    select '200000002' union all 
    select '0300000394' union all 
    select '0200000004' union all 
    select ' 200000001' union all 
    select ' 300000378' union all 
    select '300000393 ' union all 
    select '300000379 ' union all 
    select '200000003'; 

select * from t_tra_main where pid in (200000002,300000394,200000004, 
    200000001,300000378,300000393,300000379,200000003) 

select * from t_tra_main where pid in ('200000002','300000394','200000004', 
    '200000001','300000378','300000393','300000379','200000003')