丢失空值使用where过滤sql查询结果

时间:2013-09-23 16:38:14

标签: 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子句并输入了一个,但是我没有看到这种方法的过滤。

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

5 个答案:

答案 0 :(得分:5)

尝试类似:

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

因为根据定义NULL是一个未知值(比特简化但是对于这个解释是可以的),它既不会等于或不等于给定值 - 这就是为什么这里需要IS NULL。 / p>

答案 1 :(得分:2)

此引用来自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语句的输出。

enter image description here

答案 2 :(得分:0)

where (X.Name != 'xxx' or X.name Is Null)
and  (XY.Product != 1 or XY.Product Is Null)

答案 3 :(得分: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

答案 4 :(得分:0)

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