argument of AND must not return a set when using regexp_matches

Started by Robert Jamesabout 13 years ago2 messagesgeneral
Jump to latest
#1Robert James
srobertjames@gmail.com

I've been getting a funny SQL error, which I've boiled down to this case.

SELECT (regexp_matches('abc', '(.)b(.)'))[1] IS NOT NULL
-- Returns true, as expected

SELECT (regexp_matches('abc', '(.)b(.)'))[1] IS NOT NULL AND true
-- Gives this error:
ERROR: argument of AND must not return a set
SQL state: 42804

Can anyone make heads or tails of it? Is it a real bug? Is there a work around?

Postgres 8.3

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert James (#1)
Re: argument of AND must not return a set when using regexp_matches

Robert James <srobertjames@gmail.com> writes:

SELECT (regexp_matches('abc', '(.)b(.)'))[1] IS NOT NULL AND true
-- Gives this error:
ERROR: argument of AND must not return a set
SQL state: 42804

Can anyone make heads or tails of it? Is it a real bug? Is there a work around?

It's not a bug: regexp_matches returns a set of rows, not a scalar
result.

You might want to stick it into a sub-select as per the trick suggested
in the manual - then you get a NULL rather than zero rows when there's
no match. (Or, in the particular example at hand, it's not very clear
why you're using regexp_matches at all and not a plain old ~ operator.)

regards, tom lane

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general