[PERFORM] limitation using LIKE on ANY(array)

2006-03-24 Thread K C Lau



With 8.1.3, I get an error when trying to do this on a Text[] column
:
.. WHERE ANY(array) LIKE 'xx%'

Indeed, I get rejected even with:
.. WHERE ANY(array) = 'xx'

In both cases, the error is: ERROR: syntax error at or near
any ... 

It would only work as documented in the manual (8.10.5):
SELECT * FROM sal_emp WHERE 1 = ANY (pay_by_quarter);

It appears that this restriction is still in place in
8.2:

http://developer.postgresql.org/docs/postgres/arrays.html

Is that the case?
Thanks in advance,
KC.



Re: [PERFORM] limitation using LIKE on ANY(array)

2006-03-24 Thread Tom Lane
K C Lau [EMAIL PROTECTED] writes:
 Indeed, I get rejected even with:
 .. WHERE ANY(array) = 'xx'

 It would only work as documented in the manual (8.10.5):
 SELECT * FROM sal_emp WHERE 1 = ANY (pay_by_quarter);

That's not changing any time soon; the SQL spec defines only the second
syntax for ANY, and I believe there would be syntactic ambiguity if we
tried to allow the other.

 With 8.1.3, I get an error when trying to do this on a Text[] column :
 .. WHERE ANY(array) LIKE 'xx%'

If you're really intent on doing that, make an operator for reverse
LIKE and use it with the ANY on the right-hand side.

regression=# create function rlike(text,text) returns bool as
regression-# 'select $2 like $1' language sql strict immutable;
CREATE FUNCTION
regression=# create operator ~~~ (procedure = rlike, leftarg = text,
regression(# rightarg = text, commutator = ~~);
CREATE OPERATOR
regression=# select 'xx%' ~~~ any(array['aaa','bbb']);
 ?column?
--
 f
(1 row)

regression=# select 'xx%' ~~~ any(array['aaa','xxb']);
 ?column?
--
 t
(1 row)

regression=#

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