【问题标题】:IN operator not finding matchesIN 运算符未找到匹配项
【发布时间】:2013-05-11 18:12:08
【问题描述】:

我无法通过使用单引号的IN 子句选择值。 pid 列是varchar(50)。

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')

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

【问题讨论】:

  • 反对选民的请添加评论。它会有所帮助
  • pid 值是否用前导零填充?如果是这样,那就可以解释了。当您在 IN 列表中使用数值时,它会隐式地将值 (pid) 转换为数值,从而去除前导零。
  • 投反对票的不是我。 = 现有 ID 之一是否有效?适用于我的 sql-server 2012,因此只能假设发生了一些奇怪的事情,例如PID 列上的奇怪索引、损坏的表(尝试 DBCC 吗?)或者这些值都不在表中。
  • @TonyHopkinson :这些记录存在于表中。我可以用第一个查询选择它。当 pid 包含字母数字值时出现问题,例如 M02000001
  • 请在 sqlfiddle.com 上发布一个 repro。如果没有实际的表定义和证明问题的真实数据,则假设数据不是您所期望的,而且我们不是通灵者,因此我们无法告诉您出了什么问题。

标签: sql sql-server sql-server-2012 sql-server-2012-express


【解决方案1】:

一些实验,我认为表中的值在开头要么有空格,要么有零。

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

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

SQL Fiddle 是 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')

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2014-04-20
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多