From: BillR <iambill@williamrosmus.com>
To: Peter Eisentraut <peter_e@gmx.net>
Cc: pgsql-sql@postgresql.org, "D'Arcy J.M. Cain" <darcy@druid.net>
Cc: Andrew Sullivan <ajs@crankycanuck.ca>
Subject: Re: Differentiate Between Zero-Length String and NULLColumn Values
Date: Wed, 31 Jan 2007 12:18:03 -0800
Message-ID: <45C0F97B.4080104@williamrosmus.com> (raw)
In-Reply-To: <200701301959.37775.peter_e@gmx.net>
References: <20070130131334.GD31676@phlogiston.dyndns.org>
<20070130142332.GA31905@phlogiston.dyndns.org>
<20070130113834.fa8d09e0.darcy@druid.net>
<200701301959.37775.peter_e@gmx.net>
Peter Eisentraut wrote:
> D'Arcy J.M. Cain wrote:
>
>> SELECT * FROM table WHERE column IS NULL;
>> SELECT * FROM table WHERE column = NULL;
>>
>> The latter violates the SQL spec and is not allowed by PostgreSQL
>> without setting a special flag.
>>
>
> It doesn't violate any spec and it's certainly allowed by PostgreSQL
> without any flags. It's just that the result is not what some people
> expect.
>
>
"= NULL" violates the SQL-92 Specification. Relevant section posted below.
Additionally *none of the example code* in the SQL-92 specification
document uses the expression "WHERE #value# = NULL"
*All* the example code in the specification use the expression as:
"WHERE #value# IS NULL"
8.6 <null predicate>
Function
Specify a test for a null value.
Format
<null predicate> ::= <row value constructor> IS [ NOT ] NULL
Syntax Rules
None.
Access Rules
None.
General Rules
1) Let R be the value of the <row value constructor>.
2) If all the values in R are the null value, then "R IS NULL" is
true; otherwise, it is false.
3) If none of the values in R are the null value, then "R IS NOT
NULL" is true; otherwise, it is false.
Note: For all R, "R IS NOT NULL" has the same result as "NOT
R IS NULL" if and only if R is of degree 1. Table 12, "<null
predicate> semantics", specifies this behavior.
________________Table_12-<null_predicate>_semantics________________
R IS R IS NOT NOT R IS NOT R IS NOT
_Expression_______NULL____NULL__________NULL__________NULL_________
| degree 1: null | true | false | false | true |
| | | | | |
| degree 1: not | false | true | true | false |
null
| degree > 1: | true | false | false | true |
| all null | | | | |
| | | | | |
| degree > 1: | false | false | true | true |
| some null | | | | |
| | | | | |
| degree > 1: | false | true | true | false |
|_none_null______|_______|_____________|____________|______________|
| | | | | |
|Leveling Rules | | | | |
| | | | | |
218 Database Language SQL
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-sql@postgresql.org
Cc: iambill@williamrosmus.com, peter_e@gmx.net, darcy@druid.net, ajs@crankycanuck.ca
Subject: Re: Differentiate Between Zero-Length String and NULLColumn Values
In-Reply-To: <45C0F97B.4080104@williamrosmus.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox