当前位置:  开发笔记 > 数据库 > 正文

T-SQL varchar比较问题

如何解决《T-SQLvarchar比较问题》经验,为你挑选了1个好方法。

我正在使用MS Sql 2005.

为什么这会给我正确的结果(返回169行)...

select
  * 
from 
  [import_Data] 
where 
  [import_Data].name not in 
  (
    select 
      [import_Data].name 
    from 
      [import_Data] 
      inner join [resource] on [import_Data].name = [resource].name
    where 
      [import_Data].ProviderTypeID = 4 
      and [resource].IsDeleted = 0
  )
  and [import_Data].ProviderTypeID = 4

但这不(返回0行)......

select 
  * 
from 
  [import_Data] 
where 
  [import_Data].name not in 
  (
    select 
      [resource].name 
    from 
      [resource] 
    where 
      IsDeleted = 0
  ) 
  and [import_Data].ProviderTypeID = 4

name列之间的唯一区别是[resource].nameis varchar(500)[import_Data].nameis varchar(300).



1> Will Rickard..:

我的猜测是资源表中有一个null resource.name,它会抛弃所有的比较.为什么空值会导致问题?根据"Guru对TSQL的指导",我正在解释"ANSI指南声明将相等值与NULL进行比较的表达式总是返回NULL." 所以列表中的任何null都会抛出整个事物.

在您的第一个查询中,您的内部联接将排除这些空值.

所以你有三个选择

不要使用NOT IN,使用NOT EXISTS

在resource.name上使用ISNULL来消除空值

通过将ANSI_NULLS设置为OFF来更改空值处理行为.

使用相关子查询(警告空中代码)不存在的示例

SELECT *
FROM [import_Data] 
WHERE NOT EXISTS(
        select [resource].name from [resource] where IsDeleted = 0 AND [resource].name = [import_Data].name
    )
  AND [import_Data].ProviderTypeID = 4

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有