2013-07-02 17 views
7

Voglio solo ottenere i record che hanno alcune parole in una colonna, ho provato a utilizzare WHERE ... IN (...) ma Postgres è case sensitive in questa clausola where. Ecco perché ho provato regex e l'operatore ~*.Regex per trovare parole complete a Postgresql

Il seguente è un frammento SQL che restituisce tutte le colonne e le tabelle dal DB, voglio limitare le righe per portare solo le tabelle nell'espressione regex.

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 

Questa espressione regolare porterà tutte le colonne dei saldi e le colonne delle tabelle che contengono la parola 'SALDI'.

Voglio limitare il risultato solo ai nomi completi.

risposta

7

Utilizzando le espressioni regolari, la soluzione comune utilizza word boundaries prima e dopo l'espressione corrente.

Vedere effetto senza: http://regexr.com?35ecl

Vedere effetto con confini di parola: http://regexr.com?35eci

In PostgreSQL, the word boundaries are denoted by \y(altri motori regex popolari, come PCRE, C# e Java, utilizzare \b invece - in tal modo il suo utilizzo nella demo regex sopra - grazie @IgorRomanchenko).

Così, per il vostro caso, l'espressione di seguito potrebbe essere utilizzato (le partite sono le stesse come l'esempio espressioni regolari nei link sopra):

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

Sede demo di questa espressione in uso qui: http://sqlfiddle.com/#!12/9f597/1

+0

In Postgres '\ b' significa' backspace, come in C'. Puoi usare '\ y' per' corrispondenze solo all'inizio o alla fine di una parola'. Dettagli ['here'] (http://www.postgresql.org/docs/current/static/functions-matching.html) –

+0

@IgorRomanchenko Sì, grazie per averlo fatto notare! – acdcjunior

+0

Pedantico, ma direi "molti altri regex engine" piuttosto che "regular reisex" - le regex non sono realmente standardizzate, quindi di solito è meglio trovare il manuale per qualunque "flavor" su uno strumento particolare anziché fare qualche ipotesi. – IMSoP

3

Se si desidera far corrispondere solo tutta table_name uso qualcosa come

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

^ partite all'inizio della stringa.

$ partite alla fine della stringa.

Dettagli here.

In alternativa si può usare qualcosa come:

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

per rendere IN case insensitive.

+0

+1 buone soluzioni! – acdcjunior

+0

+1 perché hai fornito la soluzione senza regex –

Problemi correlati