Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regular expression in PostgreSQL LIKE clause

I'm stuck with a simple regular expression. Not sure what I'm missing. A little rusty on regex skills.

The expression I'm trying to match is:

select * from table where value like '00[1-9]%'
-- (third character should not be 0)

So this should match '0090D0DF143A' (format: text) but it's NOT!

like image 454
borarak Avatar asked Jun 23 '14 14:06

borarak


People also ask

Can we use regular expression in PostgreSQL?

The Regular Expressions in PostgreSQL are implemented using the TILDE (~) operator and uses '. *” as a wildcard operator. As you can see in the figure above, we have used Regular Expression in PostgreSQL using the TILDE (~) operator and the wildcard '.

How do I match a string in PostgreSQL?

We can compare the string using like clause in PostgreSQL, we can also compare the string using the =, != , <>, <, >, <= and >= character string operator. Basically character string operator in PostgreSQL is used to compare the string and return the result as we specified input within the query.

What is the difference between like and Ilike in PostgreSQL?

The predicates LIKE and ILIKE are used to search for strings that match a given pattern, so you can search or for a single word (or string) in a long text field. LIKE is case sensitive, ILIKE is case insensitive.


2 Answers

Like @a_horse commented, you would have to use the regular expression operator ~ to use bracket expressions.
But there's more. I suggest:

SELECT * FROM   tbl WHERE  value ~ '^00[^0]' 

^ ... match at start of string (your original expression could match at any position).
[^0] ... a bracket expression (character class) matching any character that is not 0.

Or better, yet:

SELECT * FROM   tbl WHERE  value LIKE '00%'       -- starting with '00' AND    value NOT LIKE '000%'  -- third character is not '0' 

Why? LIKE is not as powerful, but typically faster than regular expressions. It's probably substantially faster to narrow down the set of candidates with a cheap LIKE expression.

Generally, you would use NOT LIKE '__0', but since we already establish LIKE '00%' in the other predicate, we can use the narrower (cheaper) pattern NOT LIKE '000'.

Postgres can use a simple btree index for the left-anchored expressions value LIKE '00%' (important for big tables), while that might not work for a more complex regular expression. The latest version of Postgres can use indexes for simple regular expressions, so it might work for this example. Details:

  • Difference between LIKE and ~ in Postgres
like image 116
Erwin Brandstetter Avatar answered Oct 06 '22 00:10

Erwin Brandstetter


PostgreSQL's LIKE operator doesn't support [charlist], however SIMILAR TO does.

check HERE for a comprehensive list across DBs

like image 43
sunbabaphu Avatar answered Oct 06 '22 00:10

sunbabaphu