Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regex to find complete words at Postgresql

I want to only get the records that have some words at one column, I have tried using WHERE ... IN (...) but Postgres is case sensitive in this where clause. This is why I tried regex and ~* operator.

The following is a SQL snippet that returns all the columns and tables from the DB, I want to restrict the rows to bring only the tables in the regex expresion.

SELECT ordinal_position as COLUMN_ID, TABLE_NAME, COLUMN_NAME
                        FROM information_schema.columns
                        WHERE table_schema = 'public' and  table_name ~* 'PRODUCTS|BALANCES|BALANCESBARCODEFORMATS|BALANCESEXPORTCATEGORIES|BALANCESEXPORTCATEGORIESSUB'
                        order by TABLE_NAME, COLUMN_ID

This regex will bring all the columns of BALANCES and the columns of the tables that contain the 'BALANCES' keyword.

I want to restrict the result to complete names only.

like image 837
Menelaos Vergis Avatar asked Jul 02 '13 15:07

Menelaos Vergis


People also ask

Can I use regex in PostgreSQL?

The simplest use of regex in PostgreSQL is the ~ operator, and its cousin the ~* operator. value ~ regex tests the value on the left against the regex on the right and returns true if the regex can match within the value. Note that the regex does not have to fully match the whole value, it just has to match a part.

What is full text search in PostgreSQL?

Full text searching in PostgreSQL is based on the match operator @@ , which returns true if a tsvector (document) matches a tsquery (query).

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 regexp in PostgreSQL?

Regular Expressions, also known as RegEx are pattern matching criteria that can filter data based on the pattern. It is heavily used to match string values to a specific pattern and then filter the results based on the condition.


2 Answers

Using regexes, the common solution is using word boundaries before and after the current expression.

See effect without: http://regexr.com?35ecl

See effect with word boundaries: http://regexr.com?35eci

In PostgreSQL, the word boundaries are denoted by \y (other popular regex engines, such as PCRE, C# and Java, use \b instead - thus its use in the regex demo above - thanks @IgorRomanchenko).

Thus, for your case, the expression below could be used (the matches are the same as the example regexes in the links above):

'\y(PRODUCTS|BALANCES|BALANCESBARCODEFORMATS|BALANCESEXPORTCATEGORIES|BALANCESEXPORTCATEGORIESSUB)\y'

See demo of this expression in use here: http://sqlfiddle.com/#!12/9f597/1

like image 62
acdcjunior Avatar answered Oct 19 '22 13:10

acdcjunior


If you want to match only whole table_name use something like

'^(PRODUCTS|BALANCES|BALANCESBARCODEFORMATS|BALANCESEXPORTCATEGORIES|BALANCESEXPORTCATEGORIESSUB)$'

^ matches at the beginning of the string.

$ matches at the end of the string.

Details here.

Alternatively you can use something like:

 upper(table_name) IN ('PRODUCTS','BALANCES','BALANCESBARCODEFORMATS','BALANCESEXPORTCATEGORIES', ...)

to make IN case insensitive.

like image 44
Ihor Romanchenko Avatar answered Oct 19 '22 12:10

Ihor Romanchenko