使用where筛选sql查询结果时丢失空值
我有一个连接7个以上表的复杂查询。 在连接之后,我想过滤查询的结果 这是我观察到的一些情况 当我做where子句时使用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,但我根本看不到这种方法的过滤效果 是否有一种方法可
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!=1Null具有有趣的相等属性。也尝试切换,而不是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