使用where筛选sql查询结果时丢失空值

使用where筛选sql查询结果时丢失空值,sql,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,我有一个连接7个以上表的复杂查询。 在连接之后,我想过滤查询的结果 这是我观察到的一些情况 当我做where子句时 where X.Name != 'xxx' and XY.Product != 1 我得到了过滤结果,但是X.Name和XY.Product的所有空值也消失了 从我的结果来看。我想保留空值 我还尝试: and X.Name != 'xxx' and XY.Product != 1 我完全删除了where子句,并添加了and,但我根本看不到这种方法的过滤效果 是否有一种方法可

我有一个连接7个以上表的复杂查询。 在连接之后,我想过滤查询的结果

这是我观察到的一些情况

当我做where子句时

where X.Name != 'xxx'
and  XY.Product != 1
我得到了过滤结果,但是X.Name和XY.Product的所有空值也消失了 从我的结果来看。我想保留空值

我还尝试:

and X.Name != 'xxx'
and  XY.Product != 1
我完全删除了where子句,并添加了and,但我根本看不到这种方法的过滤效果

是否有一种方法可以在不丢失空值的情况下过滤结果???

尝试以下操作:

where (X.Name <> 'xxx' or X.Name is null)
  and (XY.Product <> 1 or XY.Product is null)

因为,根据定义,NULL是一个未知值位,经过简化,但对于这个解释来说是可以的,它既不等于也不等于给定值-这就是为什么这里需要is NULL。

这段引文取自70-461培训工具包

where (X.Name != 'xxx' or X.name Is Null)
and  (XY.Product != 1 or XY.Product Is Null)
T-SQL——同样,基于标准SQL,对于任何类型的缺失值,只实现一个称为NULL的通用标记。这导致了三值谓词逻辑

因此,这里有三个逻辑条件

1-值与条件匹配 2-值与条件不匹配 3-缺少值

下面是一些示例代码

-- Create sample table
create table #products
( 
  my_id int identity (1, 1),
  my_name varchar(16)
);

-- Load with sample data
insert into #products (my_name) values
(NULL),
('iPad'),
('Windows Surface');

-- Show the data
select * from #products

-- Show just ipads
select * from #products where my_name = 'iPad'

-- Show just surfaces
select * from #products where my_name <> 'iPad'

-- Show ipads & unknowns
select * from #products where my_name = 'iPad' or my_name is null
下面是最后三条select语句的输出

为什么不使用这个:
其中isnullX.Name,!='xxx'和isnullXY.Product,0!=1

Null具有有趣的相等属性。也尝试切换,而不是X.Name='xxx'。您是否已验证在加入后是否具有所有空值?常见的错误是,在进行多个联接时,先进行内部联接,再进行外部联接。这可能会否定外部联接效果,并怀疑您有外部联接。检查=或!=在哪里杀了外人。请参阅das的解决方案。
-- Create sample table
create table #products
( 
  my_id int identity (1, 1),
  my_name varchar(16)
);

-- Load with sample data
insert into #products (my_name) values
(NULL),
('iPad'),
('Windows Surface');

-- Show the data
select * from #products

-- Show just ipads
select * from #products where my_name = 'iPad'

-- Show just surfaces
select * from #products where my_name <> 'iPad'

-- Show ipads & unknowns
select * from #products where my_name = 'iPad' or my_name is null