Thread: Problems with PL/pgSQL and LIKE statement

Problems with PL/pgSQL and LIKE statement

From
"Paul Murphy"
Date:
Hi all,

I'm writing a function that basically returns all of the URLs that are
like (in the SQL sense of LIKE) a string that I supply. I can't seem to
get the correct arrangement of percent symbols and quotes to get the
statement to run correctly.

Here's a simplified version of what I'm trying to do...

CREATE OR REPLACE FUNCTION get_urls_like(varchar)
  RETURNS varchar AS
'DECLARE
    param ALIAS FOR $1;
    entry varchar;
BEGIN
    FOR entry IN SELECT url AS url
            FROM urls u
            WHERE url LIKE ''''%''''  || param  || ''''%''''
    LOOP
        RETURN NEXT entry;
    END LOOP;
    RETURN;
END;'
  LANGUAGE 'plpgsql' STABLE;


Any help gratefully received. I've tried various combinations of percent
signs and single quotes and usually end up with errors like the
following.

ERROR:  operator is not unique: "unknown" % "unknown"
HINT:  Could not choose a best candidate operator. You may need to add
explicit type casts.
CONTEXT:  PL/pgSQL function "get_classifications_like" line 6 at for
over select rows

Cheers

Paul

Paul Murphy
Senior Software Engineer
Packet Dynamics Ltd
tel: +44 (0)1506 426 976
fax: +44 (0)1506 418 844
pmurphy at bloxx dot com
Call 08700 4 BLOXX or visit www.bloxx.com


Re: Problems with PL/pgSQL and LIKE statement

From
"Schuhmacher, Bret"
Date:
This works for me:
...like ''%'' || b.vendor_name || ''%''

Looks like you have too many single quotes...

Rgds,

Bret

> -----Original Message-----
> From: pgsql-novice-owner@postgresql.org
> [mailto:pgsql-novice-owner@postgresql.org] On Behalf Of Paul Murphy
> Sent: Thursday, January 20, 2005 11:21 AM
> To: pgsql-novice@postgresql.org
> Subject: [NOVICE] Problems with PL/pgSQL and LIKE statement
>
> Hi all,
>
> I'm writing a function that basically returns all of the URLs
> that are like (in the SQL sense of LIKE) a string that I
> supply. I can't seem to get the correct arrangement of
> percent symbols and quotes to get the statement to run correctly.
>
> Here's a simplified version of what I'm trying to do...
>
> CREATE OR REPLACE FUNCTION get_urls_like(varchar)
>   RETURNS varchar AS
> 'DECLARE
>     param ALIAS FOR $1;
>     entry varchar;
> BEGIN
>     FOR entry IN SELECT url AS url
>             FROM urls u
>             WHERE url LIKE ''''%''''  || param  || ''''%''''
>     LOOP
>         RETURN NEXT entry;
>     END LOOP;
>     RETURN;
> END;'
>   LANGUAGE 'plpgsql' STABLE;
>
>
> Any help gratefully received. I've tried various combinations
> of percent signs and single quotes and usually end up with
> errors like the following.
>
> ERROR:  operator is not unique: "unknown" % "unknown"
> HINT:  Could not choose a best candidate operator. You may
> need to add explicit type casts.
> CONTEXT:  PL/pgSQL function "get_classifications_like" line 6
> at for over select rows
>
> Cheers
>
> Paul
>
> Paul Murphy
> Senior Software Engineer
> Packet Dynamics Ltd
> tel: +44 (0)1506 426 976
> fax: +44 (0)1506 418 844
> pmurphy at bloxx dot com
> Call 08700 4 BLOXX or visit www.bloxx.com
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
>       subscribe-nomail command to majordomo@postgresql.org so
> that your
>       message can get through to the mailing list cleanly
>

Re: Problems with PL/pgSQL and LIKE statement

From
"Paul Murphy"
Date:
Hi all,

I've got it solved - I was using PgAdmin III to enter the function, and
the escaping of quotes it uses seems to have been the problem (or my
understanding of how it escapes quotes...). When I switched to using
psql, I tried the syntax that Brett suggested and the function works
fine.

FYI, the syntax that Brett suggests below gets displayed as

...LIKE \'%\'  || param  || \'%\'

in PgAdmin III.

Cheers

Paul

-----Original Message-----
From: Schuhmacher, Bret [mailto:Bret.Schuhmacher@Aspect.com]
Sent: 21 January 2005 04:58
To: Paul Murphy; pgsql-novice@postgresql.org
Subject: RE: [NOVICE] Problems with PL/pgSQL and LIKE statement

This works for me:
...like ''%'' || b.vendor_name || ''%''

Looks like you have too many single quotes...

Rgds,

Bret

> -----Original Message-----
> From: pgsql-novice-owner@postgresql.org
> [mailto:pgsql-novice-owner@postgresql.org] On Behalf Of Paul Murphy
> Sent: Thursday, January 20, 2005 11:21 AM
> To: pgsql-novice@postgresql.org
> Subject: [NOVICE] Problems with PL/pgSQL and LIKE statement
>
> Hi all,
>
> I'm writing a function that basically returns all of the URLs
> that are like (in the SQL sense of LIKE) a string that I
> supply. I can't seem to get the correct arrangement of
> percent symbols and quotes to get the statement to run correctly.
>
> Here's a simplified version of what I'm trying to do...
>
> CREATE OR REPLACE FUNCTION get_urls_like(varchar)
>   RETURNS varchar AS
> 'DECLARE
>     param ALIAS FOR $1;
>     entry varchar;
> BEGIN
>     FOR entry IN SELECT url AS url
>             FROM urls u
>             WHERE url LIKE ''''%''''  || param  || ''''%''''
>     LOOP
>         RETURN NEXT entry;
>     END LOOP;
>     RETURN;
> END;'
>   LANGUAGE 'plpgsql' STABLE;
>
>
> Any help gratefully received. I've tried various combinations
> of percent signs and single quotes and usually end up with
> errors like the following.
>
> ERROR:  operator is not unique: "unknown" % "unknown"
> HINT:  Could not choose a best candidate operator. You may
> need to add explicit type casts.
> CONTEXT:  PL/pgSQL function "get_classifications_like" line 6
> at for over select rows
>
> Cheers
>
> Paul
>
> Paul Murphy
> Senior Software Engineer
> Packet Dynamics Ltd
> tel: +44 (0)1506 426 976
> fax: +44 (0)1506 418 844
> pmurphy at bloxx dot com
> Call 08700 4 BLOXX or visit www.bloxx.com
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
>       subscribe-nomail command to majordomo@postgresql.org so
> that your
>       message can get through to the mailing list cleanly
>