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

From Ulf Mehlig
Subject Re: [SQL] How match percent sign in SELECT using LIKE?
Date
Msg-id 199903110845.JAA02036@pandora3.uni-bremen.de
Whole thread Raw
In response to How match percent sign in SELECT using LIKE?  (Dan Lauterbach <danla@micromotion.com>)
Responses Re: [SQL] How match percent sign in SELECT using LIKE?  (Bruce Momjian <maillist@candle.pha.pa.us>)
List pgsql-sql
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
----------------------------------------------------------------------

pgsql-sql by date:

Previous
From: Vikrant Rathore
Date:
Subject: unsubscribe
Next
From: Herouth Maoz
Date:
Subject: Re: SQL92 standard conformance [was Re: [SQL] OUTER JOINS in 6.4.2?? Work around??