6

我有一个复杂的查询,它连接了 7 个以上的表。加入后,我想过滤我的查询结果。

这是我观察到的。

当我执行 where 子句时

where X.Name != 'xxx'
and  XY.Product != 1

我得到了过滤后的结果,但是 X.Name 和 XY.Product 的所有空值也从我的结果中消失了。我想保留空值。

我也试过:

and X.Name != 'xxx'
and  XY.Product != 1

我完全删除了 where 子句并放入了一个 and ,但我根本看不到这种方法的过滤。

有没有一种方法可以过滤我的结果而不会丢失空值?

4

5 回答 5

9

尝试类似:

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

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

于 2013-09-23T16:40:32.013 回答
4

此报价来自 70-461 培训套件。

“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 语句的输出。

在此处输入图像描述

于 2013-09-23T17:32:29.127 回答
0
where (X.Name != 'xxx' or X.name Is Null)
and  (XY.Product != 1 or XY.Product Is Null)
于 2013-09-23T16:50:03.517 回答
0
SELECT X.NAME,XY.PRODUCT FROM

(SELECT ID,NAME FROM TABLE_X WHERE NAME!=1)X
OUTER JOIN
(SELECT ID,PRODUCT FROM TABLE_XY WHERE PRODUCT!=1)XY
ON X.ID=XY.ID
于 2013-09-23T17:30:31.890 回答
0

为什么不使用这个: where isnull(X.Name,'') != 'xxx' and isnull(XY.Product,0) != 1

于 2014-10-16T20:27:29.433 回答