我有一个复杂的查询,它连接超过7个表。 在连接之后,我想过滤查询的结果。
这是我观察到的事情。
当我做一个where子句时
where X.Name != 'xxx'
and XY.Product != 1
我得到了过滤结果,但X.Name和XY.Product的所有空值也都消失了 从我的结果。我想保留空值。
我也尝试过:
and X.Name != 'xxx'
and XY.Product != 1
我完全删除了where子句并输入了一个,但是我没有看到这种方法的过滤。
有没有办法可以过滤我的结果而不会丢失空值?
答案 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语句的输出。
答案 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