다음을 통해 공유


SQL Server Troubleshooting: Select from NULL rows


Preparation and test

First we will create #test and #test_link tables and will inserted data in this table

 

create table #test (cities char(30),countries char(30))
insert #test values('Tokyo','Japan')
insert #test values('Moscow','Russian')
insert #test values('New York','USA')
insert #test values('London','GB')
 
create table #test_link (city char(30),companies char(30))
insert #test_link values('Tokyo','Toyota')
insert #test_link values('Moscow','Lada')
insert #test_link values('New York','HP')
insert #test_link values('London','Central Bank')
insert #test_link values('Berlin','BMW')
 
 
select * from  #test 
 
select * from  #test_link 
 
cities  countries
---------  -----------
Tokyo  Japan  
Moscow  Russian  
New York  USA  
London  GB  
 
city  companies
---------  -----------
Tokyo  Toyota  
Moscow  Lada  
New York  HP  
London  Central Bank  
Berlin  BMW  

and with simple scripts we will select wich city not in the #test table

select * from  #test_link
 where  city  not   in  ( select cities from #test )
 
 
city  companies
------------------------------ ------------------------------
Berlin  BMW  

and for testing selecting problems NULL rows we first need add NULL data to #test table 

and then will selecting this query again 

insert #test values(NULL,NULL)
 
select * from  #test
 
cities  countries
------------------------------ ------------------------------
Tokyo  Japan  
Moscow  Russian  
New York  USA  
London  GB  
NULL   NULL
 
----the NULL data was add
 
 
 ----and now we will run  our working query again
 
 select * from  #test_link
 where  city  not   in  ( select cities from #test )
 
city  companies
------------------------------ ------------------------------

Results show nothing was selected.

What happened with our query ?

Everytime working with NULL rows gives bad results.

Root cause

For this problems in SQL SERVER have standard from ANSI SQL  "ANSI_NULLS"

For working with NULL rows we need to use SET ANSI_NULLS OFF and run our query. And then again SET ANSI_NULLS ON, then for testing select NULL rows we are need again return our query

 SET ANSI_NULLS OFF  -----------------  first we are need  disable  ANSI_NULLS
 select * from  #test_link
 where  city  not   in  ( select cities from #test )
 SET ANSI_NULLS ON  -----------------  end we are need enable ANSI_NULLS  
 
 
city  companies
------------------------------ ------------------------------
Berlin  BMW  

Result was success, column was selected.