NOT IN not equal to <>
Hi!
I am between session of 24 hour of PASS right now, so I just post this piece of code I helped out with on a forum.
The original poster was amazed that 
Col1 <> 'Some value'
didn't return same records as
Col1 NOT IN ('Some value')
See this example code to understand the implications of fiddling with SET ANSI_NULLS option setting.
declare @sample table
        (
            d varchar(200)
        )
Insert  @sample
select  'cancelled' union all
select  null
-- Try 1
set ansi_nulls off
select  d as [Try 1, <>, ANSI_NULLS off]
from    @sample
where   d <> 'cancelled'
select  d as [Try 1, NOT IN, ANSI_NULLS off]
from    @sample
where   d not in ('cancelled')
-- Try 2
set ansi_nulls on
select  d as [Try 2, <>, ANSI_NULLS on]
from    @sample
where   d <> 'cancelled'
select  d as [Try 2, NOT IN, ANSI_NULLS on]
from    @sample
where   d not in ('cancelled')
 
Legacy Comments
| Peter Cwik 2009-09-08 | re: NOT IN not equal to <> According to BOL For a script to work as intended, regardless of the ANSI_NULLS database option or the setting of SET ANSI_NULLS, use IS NULL and IS NOT NULL in comparisons that might contain null values. | 
| Peso 2009-09-08 | re: NOT IN not equal to <> The issue is not to get the NULL values. The issue OP had was why NULL values were returned at all. | 
| Dayana 2011-08-23 | re: NOT IN not equal to <> Phenomenal bkredaown of the topic, you should write for me too! | 
| mhstyhcfl 2011-08-27 | re: NOT IN not equal to <> bLiVei huqdjakfufmc |