3 value logic (TRUE, FALSE, UNKOWN)
in database is contained to give support to NULL, we generally perceived
of TRUE or FALSE, but let see how null takes part in Boolean table of OR and
AND
In below OR binary logic table, let’s focus on Unknown…
·
Unknown AND True =
Unknown
·
Unknown AND False
= False
·
Unknown AND
Unknown = Unkown
AND
|
True
|
False
|
Unknown
|
True
|
True
|
False
|
Unknown
|
False
|
False
|
False
|
False
|
Unknown
|
Unknown
|
False
|
Unknown
|
Now let’s take OR and focus on Unknown
Unknown OR True = True
Unknown OR False = Unknown
Unknown OR Unknown = Unknown
OR
|
True
|
False
|
Unknown
|
True
|
True
|
True
|
True
|
False
|
True
|
False
|
Unknown
|
Unknown
|
True
|
Unknown
|
Unknown
|
Now let’s do a practical, here I am creating #temp1 table which hold 1 to 5 numeric value
select top 5 ROW_NUMBER() over (order by name) as id into #temp1 from
sys.objects
In second sql, I am creating another table #temp2 which hold numeric
value from 1 to 3 and another value of NULL.
select * into #temp2 from
(
select top 3 row_number() over (order by name) as id from sys.objects
union
select null as id
) a
select * from #temp1;
id
--------------------
1
2
3
4
5
(5 row(s) affected)
select * from #temp2
id
--------------------
NULL
1
2
3
(4 row(s) affected)
Now let run the IN query
select 'wow!', id from #temp1 where id in (select id from #temp2)
which will be internally evaluated as
select 'wow!', id from #temp1 where id = NULL or id = 1 or id = 2 or id = 3
lets revisit OR table then decode the where condition
OR
|
True
|
False
|
Unknown
|
True
|
True
|
True
|
True
|
False
|
True
|
False
|
Unknown
|
Unknown
|
True
|
Unknown
|
Unknown
|
here if we decode where clause we will find
where id = NULL or id = 1 or id = 2 or id = 3
for id = 1,
where Unkown OR
True OR False OR False, this will result to TRUE (according to the OR
table below)
for id =2,
where Unkown OR
False OR True OR False, this will
result to TRUE (according to the OR table below)
for id =3,
where Unkown OR
False OR False OR True, this will
result to TRUE (according to the OR table below)
for id =4,
where Unkown OR
False OR False OR False, this
will result to FASE (according to the OR table below)
for id =5,
where Unkown OR
False OR False OR False, this
will result to FASE (according to the OR table below)
So the result of
select 'wow!', id from #temp1 where id in (select id from #temp2)
id
---- --------------------
wow! 1
wow! 2
wow! 3
(3 row(s) affected)
Now let’s evaluated NOT IN
select 'wow!', id from #temp1 where id not in (select id from #temp2)
it will internally evaluated as
select 'wow!', id from #temp1 where id <> null and id <> 1 and id <> 2 and id <> 3
Now lets
revisit AND table and evaluate where condition
AND
|
True
|
False
|
Unknown
|
True
|
True
|
False
|
Unknown
|
False
|
False
|
False
|
False
|
Unknown
|
Unknown
|
False
|
Unknown
|
here if we decode where clause we will find
where id <> NULL AND id = 1 AND id = 2 AND id = 3
for id = 1,
where Unkown AND
True AND False AND False, this will result to UNKNOWN (according to the
AND table below)
for id =2,
where Unkown AND
False AND True AND False, this
will result to UNKNOWN (according to the AND table below)
for id =3,
where Unkown AND
False AND False AND True, this
will result to UNKNOWN (according to the AND table below)
for id =4,
where Unkown AND
False AND False AND False, this
will result to UNKNOWN (according to the AND table below)
for id =5,
where Unkown AND
False AND False AND False, this
will result to UNKNOWN (according to the AND table below)
So the result of
select 'wow!', id from #temp1 where id not in (select id from #temp2)
id
---- --------------------
(0 row(s) affected)
Enjy coding…SQL J
Post Reference: Vikram Aristocratic Elfin Share