Re: [SQL] How match percent sign in SELECT using LIKE? - Mailing list pgsql-sql

From Bruce Momjian
Subject Re: [SQL] How match percent sign in SELECT using LIKE?
Date
Msg-id 199903151545.KAA14287@candle.pha.pa.us
Whole thread Raw
In response to Re: [SQL] How match percent sign in SELECT using LIKE?  (Ulf Mehlig <umehlig@uni-bremen.de>)
Responses Re: [SQL] How match percent sign in SELECT using LIKE?  (Herouth Maoz <herouth@oumail.openu.ac.il>)
List pgsql-sql
I have overhauled the LIKE code.  %% is not a literal %, but is the same
as wildcard %.  Literal % is \%.


> Dan Lauterbach <danla@micromotion.com> wrote:
>
>  > How do I match '%' in a SELECT query using LIKE predicate?  For
>  > example, to query for DocNo's containing string 'EW%':
>  >
>  > SELECT * FROM XXXX WHERE DocNo LIKE '%EW%%';
>  >
>  > PostgreSQL wants to treat the '%' in 'EW%' as a wildcard.  I've tried
>  > escaping the '%' using '\%',
>  > '%%'.   The SQL-92 standard provides for this using the ESCAPE keyword:
>  >
>  > SELECT * FROM XXXX WHERE DocNo LIKE '%EW#%%' ESCAPE '#';
>
> You apparently *can* use the '%' itself to mask the '%'. I read that
> somewhere, but I don't find it in PostgreSQL's documentation now.
>
>    db=> create table xxx (x text);
>    db=> insert into xxx (x) values ('aaabbbccc');
>    db=> insert into xxx (x) values ('aaabbb%ccc');
>    db=> insert into xxx (x) values ('aaabbb%%ccc');
>
> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> Normal use of % as wildcard:
>
>    db=> select * from xxx where x like 'aaa%' order by 1;
>    x
>    -----------
>    aaabbb%%ccc
>    aaabbb%ccc
>    aaabbbccc
>    (3 rows)
> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> Escaping ...
>
>    db=> select * from xxx where x like 'aaabbb%%ccc' order by 1;
>    x
>    ----------
>    aaabbb%ccc
>    (1 row)
>
>    db=> select * from xxx where x like 'aaabbb%%%%ccc' order by 1;
>    x
>    -----------
>    aaabbb%%ccc
>    (1 row)
>
>    db=> select * from xxx where x like 'aaabbb%%%%%%ccc' order by 1;
>    x
>    -
>    (0 rows)
> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> This here I consider strange (shouldn't it only escape and not
> 'wildcard' additionally?!)
>
>    db=> select * from xxx where x like 'aaabbb%%' order by 1;
>    x
>    -----------
>    aaabbb%%ccc
>    aaabbb%ccc
>    (2 rows)
>
>    db=> select * from xxx where x like 'aaabbb%%c' order by 1;
>    x
>    ----------
>    aaabbb%ccc
>    (1 row)
>
>    db=> select * from xxx where x like 'aaabbb%%cc' order by 1;
>    x
>    ----------
>    aaabbb%ccc
>    (1 row)
>
>    db=> select * from xxx where x like 'aaabbb%%ccc' order by 1;
>    x
>    ----------
>    aaabbb%ccc
>    (1 row)
>
>    db=> select * from xxx where x like 'aaabbb%%cccc' order by 1;
>    x
>    -
>    (0 rows)
> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>
> Anyway, you can use in PostgreSQL regular expressions as well:
>
>    => select * from xxx where x ~ 'aa*b{3}%c+' order by 1;
>    x
>    ----------
>    aaabbb%ccc
>    (1 row)
>
> Much better, if you know regexps. But if I remember correctly, only
> 'LIKE ...'- and regular expressions which begin with a constant,
> not-wildcard-part can be used for indexed search (other people
> certainly know that much better than me ;-)
>
> Tsch��, Ulf
>
> --
> ======================================================================
> Ulf Mehlig    <umehlig@zmt.uni-bremen.de>
>               Center for Tropical Marine Ecology/ZMT, Bremen, Germany
> ----------------------------------------------------------------------
>
>


--
  Bruce Momjian                        |  http://www.op.net/~candle
  maillist@candle.pha.pa.us            |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

pgsql-sql by date:

Previous
From: Eric J McKeown
Date:
Subject: Re: [SQL] install problem
Next
From: "Tim Perdue"
Date:
Subject: Re: [SQL] Re: [HACKERS] URGENT -