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



---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

              http://archives.postgresql.org

Reply via email to