2013-07-02 11 views
7

Chcę tylko uzyskać zapisy, które mają kilka słów w jednej kolumnie, próbowałem przy użyciu WHERE ... IN (...), ale Postgres rozróżnia wielkość liter w tym klauzuli where. Dlatego próbowałem operatora regex i ~*.Regex, aby znaleźć pełne słowa na Postgresql

Poniżej znajduje się fragment kodu SQL, który zwraca wszystkie kolumny i tabele z bazy danych, chcę ograniczyć wiersze, aby wprowadzić tylko tabele w wyrażeniu regularnym.

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 

Ten regex przyniesie wszystkie kolumny sald i kolumny tabel zawierających słowa kluczowego 'sald.

Chcę ograniczyć wynik, aby uzupełnić tylko nazwy.

Odpowiedz

7

Używając regexes, często używane jest word boundaries przed i po bieżącym wyrażeniu.

Zobacz efekt bez: http://regexr.com?35ecl

Zobacz efekt z granicami słowo: http://regexr.com?35eci

W PostgreSQL the word boundaries are denoted by \y(inne popularne silniki regex, takie jak PCRE, C# i Java, użyj \b zamiast - w ten sposób jego wykorzystania w powyższym demo regex - dzięki @IgorRomanchenko).

Tak więc w Twoim przypadku, poniżej wyrażenie może być stosowany (mecze są takie same jak przykład regexes w powyższych linków):

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

Zobacz demo tego wyrażenia używanego tutaj: http://sqlfiddle.com/#!12/9f597/1

+0

W Postgres '\ b' oznacza' backspace, jak w C'. Możesz użyć '\ y' dla' dopasowań tylko na początku lub na końcu słowa'. Szczegóły ['here'] (http://www.postgresql.org/docs/current/static/functions-matching.html) –

+0

@IgorRomanchenko Tak, dzięki za wskazanie! – acdcjunior

+0

Pedantyczny, ale powiedziałbym "wiele innych silników regex" zamiast "zwykłych wyrażeń regularnych" - regexes nie są tak naprawdę standaryzowane, więc zazwyczaj najlepiej jest znaleźć podręcznik dla dowolnego "smaku" danego narzędzia, a nie robić żadnych założeń. – IMSoP

3

Jeśli chcesz dopasować tylko cały table_name użyć czegoś podobnego

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

^ dopasowuje na początku ciągu.

$ dopasowuje na końcu napisu.

Szczegóły here.

Alternatywnie można użyć coś takiego:

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

aby IN wielkość liter ma znaczenie.

+0

+1 dobre rozwiązania! – acdcjunior

+0

+1, ponieważ dostarczyłeś rozwiązanie bez regex –

Powiązane problemy