Peter Eisentraut <[EMAIL PROTECTED]> writes:
> That is, why can't you write
> SELECT 1 IN ( ARRAY[1, 2, 3] );
> when you can write
> SELECT 1 = ANY ( ARRAY[1, 2, 3] );
> ?

The two syntaxes are in fact *not* equivalent according to SQL92.
= ANY derives from

         <quantified comparison predicate> ::=
              <row value constructor> <comp op> <quantifier> <table subquery>

         <quantifier> ::= <all> | <some>

         <all> ::= ALL

         <some> ::= SOME | ANY

(notice the RHS *must* be a <table subquery>) whereas IN comes from

         <in predicate> ::=
              <row value constructor>
                [ NOT ] IN <in predicate value>

         <in predicate value> ::=
                <table subquery>
              | <left paren> <in value list> <right paren>

         <in value list> ::=
              <value expression> { <comma> <value expression> }...

The form "expr = ANY (non-query-expr)" is therefore a spec extension,
which we are free to define as we wish, and we defined it to be a
scalar-vs-array-elements comparison.  But I don't see any way that we
can interpret "expr IN (other-expr)" as anything except a variant
spelling for a simple equality test.

                        regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to