<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: NOT IN and NULL</title>
	<atom:link href="http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html/feed/" rel="self" type="application/rss+xml" />
	<link>http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html</link>
	<description>Oracle Certified Master</description>
	<pubDate>Mon, 01 Dec 2008 21:32:24 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
		<item>
		<title>By: Hongfa Wu</title>
		<link>http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-7837</link>
		<dc:creator>Hongfa Wu</dc:creator>
		<pubDate>Wed, 25 Jun 2008 21:20:40 +0000</pubDate>
		<guid isPermaLink="false">http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-7837</guid>
		<description>Please ignore previous post, this one is correct

-----------------------------------------------
select * from dual
WHERE (1) NOT IN (SELECT NULL FROM DUAL);

/*(1) NOT IN (SELECT NULL FROM DUAL)
NOT ( 1 IN (SELECT NULL FROM DUAL))
NOT (1=NULL)
NOT (NULL)
NULL
So return now rows as only True returning rows.*/

select * from dual
WHERE (1,1) NOT IN (SELECT NULL,1 FROM DUAL);

/*(1,1) NOT IN (SELECT NULL,1 FROM DUAL)
NOT ((1,1) IN (SELECT NULL,1 FROM DUAL))
NOT (1=NULL AND 1=1)
NOT (NULL AND TRUE)
NOT (NULL)
NULL
So return now rows as only True returning rows.*/

select * from dual
WHERE (1,1) NOT IN (SELECT NULL,2 FROM DUAL);

/*(1,1) NOT IN (SELECT NULL,2 FROM DUAL)
NOT ((1,1) IN (SELECT NULL,2 FROM DUAL))
NOT (1=NULL AND 1=2)
NOT (NULL AND FALSE)
NOT (FALSE)
TRUE
So return rows.*/

/*The above analysis is based on the fact that:
NULL AND TRUE = NULL (1)
NULL AND FALSE=FALSE (2)
NULL OR TRUE=TRUE    (3)
NULL OR FALSE=NULL   (4)*/

/*Why is that? Becuase:
For ‘AND’ condition, the whole expression is TRUE only if all of them are TRUE, 
otherwise if any of them is FALSE, the whole expression will be FALSE, otherwise is NULL.

TRUE AND TRUE AND TRUE  = TRUE
TRUE AND FALSE AND NULL = FALSE
TRUE AND NULL AND FALSE = FALSE
TRUE AND NULL AND NULL  = NULL*/

--Examples:

/*TRUE AND TRUE AND TRUE = TRUE*/
SELECT * FROM DUAL
WHERE (1=1) AND (1=1) AND (1=1);
--return 1 row
/*TRUE AND FALSE AND NULL = FALSE*/
SELECT * FROM DUAL
WHERE (1=1) AND (1=2) AND (1=NULL);
--return no row

/*Not(TRUE AND FALSE AND NULL) = NOT (FALSE)=TRUE*/
SELECT * FROM DUAL
WHERE NOT((1=1) AND (1=2) AND (1=NULL));
--return 1 row

/*TRUE AND NULL AND FALSE = FALSE*/
SELECT * FROM DUAL
WHERE (1=1) AND (1=null) AND (1=2);
--return no row

/*NOT(TRUE AND NULL AND FALSE) = NOT(FALSE)=TRUE*/
SELECT * FROM DUAL
WHERE NOT((1=1) AND (1=null) AND (1=2));
--return 1 row

/*NOT(TRUE AND NULL AND NULL) = NOT(NULL)=NULL*/
SELECT * FROM DUAL
WHERE NOT((1=1) AND (1=null) AND (1=null));
--return no row

/*For ‘OR’ condition, the whole expression is FALSE if all of them are FALSE, 
otherwise if any of them is TRUE, the whole expression is TRUE, otherwise is NULL.

FALSE OR FALSE OR FALSE = FALSE
FALSE OR TRUE OR NULL = TRUE
FALSE OR NULL OR TRUE = TRUE
FALSE OR NULL OR NULL = NULL*/

--For examples:
/*FALSE OR FALSE OR FALSE = FALSE*/
SELECT * FROM DUAL
WHERE (1=2) OR (1=2) OR (1=2);
--return no row

/*NOT(FALSE OR FALSE OR FALSE) = NOT(FALSE)=TRUE*/
SELECT * FROM DUAL
WHERE NOT((1=2) OR (1=2) OR (1=2));
--return 1 row

/*FALSE OR TRUE OR NULL = TRUE*/
SELECT * FROM DUAL
WHERE (1=2) OR (1=1) OR (1=NULL);
--return 1 row

/*FALSE OR NULL OR TRUE = TRUE*/
SELECT * FROM DUAL
WHERE (1=2) OR (1=NULL) OR (1=1);
--return 1 row

/*FALSE OR NULL OR NULL = NULL*/
SELECT * FROM DUAL
WHERE (1=2) OR (1=null) OR (1=null);
--return no row

/*NOT(FALSE OR NULL OR NULL) = NOT(NULL)=NULL*/
SELECT * FROM DUAL
WHERE NOT((1=2) OR (1=null) OR (1=null));
--return no row</description>
		<content:encoded><![CDATA[<p>Please ignore previous post, this one is correct</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
select * from dual<br />
WHERE (1) NOT IN (SELECT NULL FROM DUAL);</p>
<p>/*(1) NOT IN (SELECT NULL FROM DUAL)<br />
NOT ( 1 IN (SELECT NULL FROM DUAL))<br />
NOT (1=NULL)<br />
NOT (NULL)<br />
NULL<br />
So return now rows as only True returning rows.*/</p>
<p>select * from dual<br />
WHERE (1,1) NOT IN (SELECT NULL,1 FROM DUAL);</p>
<p>/*(1,1) NOT IN (SELECT NULL,1 FROM DUAL)<br />
NOT ((1,1) IN (SELECT NULL,1 FROM DUAL))<br />
NOT (1=NULL AND 1=1)<br />
NOT (NULL AND TRUE)<br />
NOT (NULL)<br />
NULL<br />
So return now rows as only True returning rows.*/</p>
<p>select * from dual<br />
WHERE (1,1) NOT IN (SELECT NULL,2 FROM DUAL);</p>
<p>/*(1,1) NOT IN (SELECT NULL,2 FROM DUAL)<br />
NOT ((1,1) IN (SELECT NULL,2 FROM DUAL))<br />
NOT (1=NULL AND 1=2)<br />
NOT (NULL AND FALSE)<br />
NOT (FALSE)<br />
TRUE<br />
So return rows.*/</p>
<p>/*The above analysis is based on the fact that:<br />
NULL AND TRUE = NULL (1)<br />
NULL AND FALSE=FALSE (2)<br />
NULL OR TRUE=TRUE    (3)<br />
NULL OR FALSE=NULL   (4)*/</p>
<p>/*Why is that? Becuase:<br />
For ‘AND’ condition, the whole expression is TRUE only if all of them are TRUE,<br />
otherwise if any of them is FALSE, the whole expression will be FALSE, otherwise is NULL.</p>
<p>TRUE AND TRUE AND TRUE  = TRUE<br />
TRUE AND FALSE AND NULL = FALSE<br />
TRUE AND NULL AND FALSE = FALSE<br />
TRUE AND NULL AND NULL  = NULL*/</p>
<p>&#8211;Examples:</p>
<p>/*TRUE AND TRUE AND TRUE = TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=1) AND (1=1) AND (1=1);<br />
&#8211;return 1 row<br />
/*TRUE AND FALSE AND NULL = FALSE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=1) AND (1=2) AND (1=NULL);<br />
&#8211;return no row</p>
<p>/*Not(TRUE AND FALSE AND NULL) = NOT (FALSE)=TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=1) AND (1=2) AND (1=NULL));<br />
&#8211;return 1 row</p>
<p>/*TRUE AND NULL AND FALSE = FALSE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=1) AND (1=null) AND (1=2);<br />
&#8211;return no row</p>
<p>/*NOT(TRUE AND NULL AND FALSE) = NOT(FALSE)=TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=1) AND (1=null) AND (1=2));<br />
&#8211;return 1 row</p>
<p>/*NOT(TRUE AND NULL AND NULL) = NOT(NULL)=NULL*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=1) AND (1=null) AND (1=null));<br />
&#8211;return no row</p>
<p>/*For ‘OR’ condition, the whole expression is FALSE if all of them are FALSE,<br />
otherwise if any of them is TRUE, the whole expression is TRUE, otherwise is NULL.</p>
<p>FALSE OR FALSE OR FALSE = FALSE<br />
FALSE OR TRUE OR NULL = TRUE<br />
FALSE OR NULL OR TRUE = TRUE<br />
FALSE OR NULL OR NULL = NULL*/</p>
<p>&#8211;For examples:<br />
/*FALSE OR FALSE OR FALSE = FALSE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=2) OR (1=2) OR (1=2);<br />
&#8211;return no row</p>
<p>/*NOT(FALSE OR FALSE OR FALSE) = NOT(FALSE)=TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=2) OR (1=2) OR (1=2));<br />
&#8211;return 1 row</p>
<p>/*FALSE OR TRUE OR NULL = TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=2) OR (1=1) OR (1=NULL);<br />
&#8211;return 1 row</p>
<p>/*FALSE OR NULL OR TRUE = TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=2) OR (1=NULL) OR (1=1);<br />
&#8211;return 1 row</p>
<p>/*FALSE OR NULL OR NULL = NULL*/<br />
SELECT * FROM DUAL<br />
WHERE (1=2) OR (1=null) OR (1=null);<br />
&#8211;return no row</p>
<p>/*NOT(FALSE OR NULL OR NULL) = NOT(NULL)=NULL*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=2) OR (1=null) OR (1=null));<br />
&#8211;return no row</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Hongfa Wu</title>
		<link>http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-7836</link>
		<dc:creator>Hongfa Wu</dc:creator>
		<pubDate>Wed, 25 Jun 2008 20:47:56 +0000</pubDate>
		<guid isPermaLink="false">http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-7836</guid>
		<description>select * from dual
WHERE (1) NOT IN (SELECT NULL FROM DUAL);

(1) NOT IN (SELECT NULL FROM DUAL)
NOT ( 1 IN (SELECT NULL FROM DUAL))
NOT (1=NULL)
NOT (NULL)
NULL
So return now rows as only True returning rows.

select * from dual
WHERE (1,1) NOT IN (SELECT NULL,1 FROM DUAL);

(1,1) NOT IN (SELECT NULL,1 FROM DUAL)
NOT ((1,1) IN (SELECT NULL,1 FROM DUAL))
NOT (1=NULL AND 1=1)
NOT (NULL AND TRUE)
NOT (NULL)
NULL
So return now rows as only True returning rows.

select * from dual
WHERE (1,1) NOT IN (SELECT NULL,2 FROM DUAL);


(1,1) NOT IN (SELECT NULL,2 FROM DUAL)
NOT ((1,1) IN (SELECT NULL,2 FROM DUAL))
NOT (1=NULL AND 1=2)
NOT (NULL AND FALSE)
NOT (FALSE)
TRUE
So return rows.

The above analysis is based on the fact that:
NULL AND TRUE = NULL      (1)
NULL AND FALSE=FALSE     (2)
NULL OR TRUE=TRUE         (3)
NULL OR FALSE=NULL        (4)

Why is that? 
For 'AND' condition, the whole expression is TRUE only if all of them are TRUE, otherwise if any of them is FALSE, the whole expression will be FALSE, otherwise is NULL.
So, TRUE AND TRUE AND TRUE = TRUE
     TRUE AND FALSE AND NULL = FALSE
     TRUE AND NULL AND FALSE = FALSE
     TRUE AND NULL AND NULL = NULL
Examples:
/*TRUE AND TRUE AND TRUE = TRUE*/
SELECT * FROM DUAL
WHERE (1=1) AND (1=1) AND (1=1);
--return 1 row
/*TRUE AND FALSE AND NULL = FALSE*/
SELECT * FROM DUAL
WHERE (1=1) AND (1=2) AND (1=NULL);
--return no row

/*Not(TRUE AND FALSE AND NULL) = NOT (FALSE)=TRUE*/
SELECT * FROM DUAL
WHERE NOT((1=1) AND (1=2) AND (1=NULL));
--return 1 row

/*TRUE AND NULL AND FALSE = FALSE*/
SELECT * FROM DUAL
WHERE (1=1) AND (1=null) AND (1=2);
--return no row

/*NOT(TRUE AND NULL AND FALSE) = NOT(FALSE)=TRUE*/
SELECT * FROM DUAL
WHERE NOT((1=1) AND (1=null) AND (1=2));
--return 1 row

/*NOT(TRUE AND NULL AND NULL) = NOT(NULL)=NULL*/
SELECT * FROM DUAL
WHERE NOT((1=1) AND (1=null) AND (1=null));
--return no row

For 'OR' condition, the whole expression is FALSE if any of them is FALSE, otherwise if all of them is TRUE, the whole expression is TRUE, otherwise is NULL.
So, TRUE OR FALSE OR NULL =FALSE
     FALSE OR TRUE OR NULL = FALSE
     TRUE OR NULL OR TRUE = NULL
     TRUE  OR TRUE OR TRUE = TRUE

For examples:
/*FALSE OR FALSE OR FALSE = FALSE*/
SELECT * FROM DUAL
WHERE (1=2) OR (1=2) OR (1=2);
--return no row

/*NOT(FALSE OR FALSE OR FALSE) = NOT(FALSE)=TRUE*/
SELECT * FROM DUAL
WHERE NOT((1=2) OR (1=2) OR (1=2));
--return 1 row

/*FALSE OR TRUE OR NULL = TRUE*/
SELECT * FROM DUAL
WHERE (1=2) OR (1=1) OR (1=NULL);
--return 1 row

/*FALSE OR NULL OR TRUE = TRUE*/
SELECT * FROM DUAL
WHERE (1=2) OR (1=NULL) OR (1=1);
--return 1 row
    
/*FALSE OR NULL OR NULL = NULL*/
SELECT * FROM DUAL
WHERE (1=2) OR (1=null) OR (1=null);
--return no row

/*NOT(FALSE OR NULL OR NULL) = NOT(NULL)=NULL*/
SELECT * FROM DUAL
WHERE NOT((1=2) OR (1=null) OR (1=null));
--return no row


Why is that? Because</description>
		<content:encoded><![CDATA[<p>select * from dual<br />
WHERE (1) NOT IN (SELECT NULL FROM DUAL);</p>
<p>(1) NOT IN (SELECT NULL FROM DUAL)<br />
NOT ( 1 IN (SELECT NULL FROM DUAL))<br />
NOT (1=NULL)<br />
NOT (NULL)<br />
NULL<br />
So return now rows as only True returning rows.</p>
<p>select * from dual<br />
WHERE (1,1) NOT IN (SELECT NULL,1 FROM DUAL);</p>
<p>(1,1) NOT IN (SELECT NULL,1 FROM DUAL)<br />
NOT ((1,1) IN (SELECT NULL,1 FROM DUAL))<br />
NOT (1=NULL AND 1=1)<br />
NOT (NULL AND TRUE)<br />
NOT (NULL)<br />
NULL<br />
So return now rows as only True returning rows.</p>
<p>select * from dual<br />
WHERE (1,1) NOT IN (SELECT NULL,2 FROM DUAL);</p>
<p>(1,1) NOT IN (SELECT NULL,2 FROM DUAL)<br />
NOT ((1,1) IN (SELECT NULL,2 FROM DUAL))<br />
NOT (1=NULL AND 1=2)<br />
NOT (NULL AND FALSE)<br />
NOT (FALSE)<br />
TRUE<br />
So return rows.</p>
<p>The above analysis is based on the fact that:<br />
NULL AND TRUE = NULL      (1)<br />
NULL AND FALSE=FALSE     (2)<br />
NULL OR TRUE=TRUE         (3)<br />
NULL OR FALSE=NULL        (4)</p>
<p>Why is that?<br />
For &#8216;AND&#8217; condition, the whole expression is TRUE only if all of them are TRUE, otherwise if any of them is FALSE, the whole expression will be FALSE, otherwise is NULL.<br />
So, TRUE AND TRUE AND TRUE = TRUE<br />
     TRUE AND FALSE AND NULL = FALSE<br />
     TRUE AND NULL AND FALSE = FALSE<br />
     TRUE AND NULL AND NULL = NULL<br />
Examples:<br />
/*TRUE AND TRUE AND TRUE = TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=1) AND (1=1) AND (1=1);<br />
&#8211;return 1 row<br />
/*TRUE AND FALSE AND NULL = FALSE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=1) AND (1=2) AND (1=NULL);<br />
&#8211;return no row</p>
<p>/*Not(TRUE AND FALSE AND NULL) = NOT (FALSE)=TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=1) AND (1=2) AND (1=NULL));<br />
&#8211;return 1 row</p>
<p>/*TRUE AND NULL AND FALSE = FALSE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=1) AND (1=null) AND (1=2);<br />
&#8211;return no row</p>
<p>/*NOT(TRUE AND NULL AND FALSE) = NOT(FALSE)=TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=1) AND (1=null) AND (1=2));<br />
&#8211;return 1 row</p>
<p>/*NOT(TRUE AND NULL AND NULL) = NOT(NULL)=NULL*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=1) AND (1=null) AND (1=null));<br />
&#8211;return no row</p>
<p>For &#8216;OR&#8217; condition, the whole expression is FALSE if any of them is FALSE, otherwise if all of them is TRUE, the whole expression is TRUE, otherwise is NULL.<br />
So, TRUE OR FALSE OR NULL =FALSE<br />
     FALSE OR TRUE OR NULL = FALSE<br />
     TRUE OR NULL OR TRUE = NULL<br />
     TRUE  OR TRUE OR TRUE = TRUE</p>
<p>For examples:<br />
/*FALSE OR FALSE OR FALSE = FALSE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=2) OR (1=2) OR (1=2);<br />
&#8211;return no row</p>
<p>/*NOT(FALSE OR FALSE OR FALSE) = NOT(FALSE)=TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=2) OR (1=2) OR (1=2));<br />
&#8211;return 1 row</p>
<p>/*FALSE OR TRUE OR NULL = TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=2) OR (1=1) OR (1=NULL);<br />
&#8211;return 1 row</p>
<p>/*FALSE OR NULL OR TRUE = TRUE*/<br />
SELECT * FROM DUAL<br />
WHERE (1=2) OR (1=NULL) OR (1=1);<br />
&#8211;return 1 row</p>
<p>/*FALSE OR NULL OR NULL = NULL*/<br />
SELECT * FROM DUAL<br />
WHERE (1=2) OR (1=null) OR (1=null);<br />
&#8211;return no row</p>
<p>/*NOT(FALSE OR NULL OR NULL) = NOT(NULL)=NULL*/<br />
SELECT * FROM DUAL<br />
WHERE NOT((1=2) OR (1=null) OR (1=null));<br />
&#8211;return no row</p>
<p>Why is that? Because</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Laurent Schneider</title>
		<link>http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5239</link>
		<dc:creator>Laurent Schneider</dc:creator>
		<pubDate>Wed, 07 Nov 2007 08:42:18 +0000</pubDate>
		<guid isPermaLink="false">http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5239</guid>
		<description>one more plan
&lt;code&gt;
var a number
var b number
var w number
var x number
var y number
var z number
select * from dual where (:a,:b) not in ((:w,:x),(:y,:z));

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter((:Z&lt;&gt;B OR :Y&lt;&gt;A) AND (:X&lt;&gt;:B OR :W&lt;&gt;:A))
&lt;/code&gt;</description>
		<content:encoded><![CDATA[<p>one more plan<br />
<pre><code>
var a number
var b number
var w number
var x number
var y number
var z number
select * from dual where (:a,:b) not in ((:w,:x),(:y,:z));

Predicate Information (identified by operation id):
---------------------------------------------------

&nbsp;&nbsp; 1 - filter((:Z&lt;&gt;B OR :Y&lt;&gt;A) AND (:X&lt;&gt;:B OR :W&lt;&gt;:A))
</code></pre></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Laurent Schneider</title>
		<link>http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5201</link>
		<dc:creator>Laurent Schneider</dc:creator>
		<pubDate>Thu, 01 Nov 2007 08:46:06 +0000</pubDate>
		<guid isPermaLink="false">http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5201</guid>
		<description>Thanks for the hint of looking at the explain plan filter.

If you try with something else than litteral, you would get a LNNVL

&lt;code&gt;
SQL&gt; select /*+ RULE */ * from t1 where (a,b) not in (select c,d from t2);

no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 3597920939

-----------------------------------
&#124; Id  &#124; Operation          &#124; Name &#124;
-----------------------------------
&#124;   0 &#124; SELECT STATEMENT   &#124;      &#124;
&#124;*  1 &#124;  FILTER            &#124;      &#124;
&#124;   2 &#124;   TABLE ACCESS FULL&#124; T1   &#124;
&#124;*  3 &#124;   TABLE ACCESS FULL&#124; T2   &#124;
-----------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter( NOT EXISTS (SELECT 0 FROM "T2" "T2" WHERE
              LNNVL("D"&lt;&gt;:B1) AND LNNVL("C"&lt;&gt;:B2)))
   3 - filter(LNNVL("D"&lt;&gt;:B1) AND LNNVL("C"&lt;&gt;:B2))

Note
-----
   - rule based optimizer used (consider using cbo)

&lt;/code&gt;</description>
		<content:encoded><![CDATA[<p>Thanks for the hint of looking at the explain plan filter.</p>
<p>If you try with something else than litteral, you would get a LNNVL</p>
<p><pre><code>
SQL&gt; select /*+ RULE */ * from t1 where (a,b) not in (select c,d from t2);

no rows selected

Execution Plan
----------------------------------------------------------
Plan hash value: 3597920939

-----------------------------------
| Id&nbsp;&nbsp;| Operation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| Name |
-----------------------------------
|&nbsp;&nbsp; 0 | SELECT STATEMENT&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
|*&nbsp;&nbsp;1 |&nbsp;&nbsp;FILTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
|&nbsp;&nbsp; 2 |&nbsp;&nbsp; TABLE ACCESS FULL| T1&nbsp;&nbsp; |
|*&nbsp;&nbsp;3 |&nbsp;&nbsp; TABLE ACCESS FULL| T2&nbsp;&nbsp; |
-----------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

&nbsp;&nbsp; 1 - filter( NOT EXISTS (SELECT 0 FROM &quot;T2&quot; &quot;T2&quot; WHERE
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LNNVL(&quot;D&quot;&lt;&gt;:B1) AND LNNVL(&quot;C&quot;&lt;&gt;:B2)))
&nbsp;&nbsp; 3 - filter(LNNVL(&quot;D&quot;&lt;&gt;:B1) AND LNNVL(&quot;C&quot;&lt;&gt;:B2))

Note
-----
&nbsp;&nbsp; - rule based optimizer used (consider using cbo)

</code></pre></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Chris</title>
		<link>http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5193</link>
		<dc:creator>Chris</dc:creator>
		<pubDate>Wed, 31 Oct 2007 22:08:44 +0000</pubDate>
		<guid isPermaLink="false">http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5193</guid>
		<description>Running it through explain plan comes up with interesting filter predicates (10.2.0.3):

1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "DUAL" "DUAL" WHERE
              NULL IS NOT NULL))
3 - filter(NULL IS NOT NULL)</description>
		<content:encoded><![CDATA[<p>Running it through explain plan comes up with interesting filter predicates (10.2.0.3):</p>
<p>1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM &#8220;DUAL&#8221; &#8220;DUAL&#8221; WHERE<br />
              NULL IS NOT NULL))<br />
3 - filter(NULL IS NOT NULL)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ittichai</title>
		<link>http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5191</link>
		<dc:creator>ittichai</dc:creator>
		<pubDate>Wed, 31 Oct 2007 15:18:45 +0000</pubDate>
		<guid isPermaLink="false">http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5191</guid>
		<description>My 2-cent is that any comparison with NULL actually does not yield anything simply because it could not be done. A NULL (not defined) cannot be compared or calculated. I see NULL as a state. That’s why it can be only be used with IS or IS NOT.

Laurent, I agree with your assumption. Since the first comparison a!=c is not comparable due to value NULL is involved, so, I assume, it is ignored. However, the second comparison b!=d return TRUE, and that counts.

Thanks for provoking our thinking. :-)</description>
		<content:encoded><![CDATA[<p>My 2-cent is that any comparison with NULL actually does not yield anything simply because it could not be done. A NULL (not defined) cannot be compared or calculated. I see NULL as a state. That’s why it can be only be used with IS or IS NOT.</p>
<p>Laurent, I agree with your assumption. Since the first comparison a!=c is not comparable due to value NULL is involved, so, I assume, it is ignored. However, the second comparison b!=d return TRUE, and that counts.</p>
<p>Thanks for provoking our thinking. <img src='http://laurentschneider.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Laurent Schneider</title>
		<link>http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5190</link>
		<dc:creator>Laurent Schneider</dc:creator>
		<pubDate>Wed, 31 Oct 2007 13:06:29 +0000</pubDate>
		<guid isPermaLink="false">http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5190</guid>
		<description>the point is :

(1,1) NOT IN (SELECT NULL,2 FROM DUAL);

returns TRUE

also note that &lt;i&gt;Any comparison between null and another value will return false&lt;/i&gt; is inaccurate.

&lt;code&gt;
begin
  case (1=null) 
    when TRUE then 
      dbms_output.put_line('true');
    when FALSE then 
      dbms_output.put_line('false'); 
    else 
      dbms_output.put_line('Not TRUE and not FALSE'); 
  end case;
end;
/

Not TRUE and not FALSE
&lt;/code&gt;</description>
		<content:encoded><![CDATA[<p>the point is :</p>
<p>(1,1) NOT IN (SELECT NULL,2 FROM DUAL);</p>
<p>returns TRUE</p>
<p>also note that <i>Any comparison between null and another value will return false</i> is inaccurate.</p>
<p><pre><code>
begin
&nbsp;&nbsp;case (1=null) 
&nbsp;&nbsp;&nbsp;&nbsp;when TRUE then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;true&#039;);
&nbsp;&nbsp;&nbsp;&nbsp;when FALSE then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;false&#039;); 
&nbsp;&nbsp;&nbsp;&nbsp;else 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(&#039;Not TRUE and not FALSE&#039;); 
&nbsp;&nbsp;end case;
end;
/

Not TRUE and not FALSE
</code></pre></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Quique</title>
		<link>http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5189</link>
		<dc:creator>Quique</dc:creator>
		<pubDate>Wed, 31 Oct 2007 11:00:07 +0000</pubDate>
		<guid isPermaLink="false">http://laurentschneider.com/wordpress/2007/10/not-in-and-null.html#comment-5189</guid>
		<description>Any comparison between null and another value will return false, unless the operators are used is null or is not null</description>
		<content:encoded><![CDATA[<p>Any comparison between null and another value will return false, unless the operators are used is null or is not null</p>
]]></content:encoded>
	</item>
</channel>
</rss>
