2013-07-02 17 views
7

Sadece bir sütunda bazı kelimeler içeren kayıtları almak istiyorum, WHERE ... IN (...)'u kullanmayı denedim, ancak Postgres bu yerde cümleye duyarlı. Bu yüzden regex ve ~* operatörünü denedim.Regex'te tam kelimeleri bulmak için Postgresql

Aşağıda, DB'deki tüm sütunları ve tabloları döndüren bir SQL snippet'i var, yalnızca satırları regex açıklamasındaki tabloları getirmek için kısıtlamak istiyorum.

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 

Bu regex tüm Dengeleri sütunlar ve 'dengeleri' anahtar kelime içeren tablo sütunları getirecektir.

Sonucu yalnızca isimleri tamamlamak için kısıtlamak istiyorum.

cevap

7

Normal ifadeler kullanıldığında, genel çözüm geçerli ifadeden önce ve sonra word boundaries kullanıyor. - böylece kullanımı PostgreSQL ise http://regexr.com?35eci

, the word boundaries are denoted by \y(örneğin PCRE'nin, C# ve Java yerine \b kullanmak gibi diğer popüler regex motorlar,: sözcük sınırları ile etkisini görün http://regexr.com?35ecl

:

olmadan etkisini görün Yukarıdaki regex demo - teşekkürler @IgorRomanchenko).

Böylece dava için aşağıdaki ifadesi (örnek yukarıdaki bağlantılarda Regexes olarak maçlar aynıdır) kullanılabilir:

'\y(PRODUCTS|BALANCES|BALANCESBARCODEFORMATS|BALANCESEXPORTCATEGORIES|BALANCESEXPORTCATEGORIESSUB)\y' 
burada kullanımda bu ifadenin

bakınız demo: http://sqlfiddle.com/#!12/9f597/1

+0

Postgres'de '\ b', as'de olduğu gibi back backspace anlamına gelir. '' Y'' için '' kelimelerini yalnızca bir kelimenin başlangıcında ya da sonunda '' kullanabilirsiniz. Ayrıntılar ['' '' '[http://www.postgresql.org/docs/current/static/functions-matching.html) –

+0

@IgorRomanchenko Evet, işaret ettiğin için teşekkürler! – acdcjunior

+0

Pedantic, ama "normal regexler" yerine "diğer regex motorları" diyorum - regexler gerçekten standardize edilmez, bu nedenle herhangi bir varsayım yapmaktan ziyade belirli bir araç çalıştırılan her hangi "lezzet" için kılavuzu bulmak genellikle en iyisidir. – IMSoP

3

Eğer

'^(PRODUCTS|BALANCES|BALANCESBARCODEFORMATS|BALANCESEXPORTCATEGORIES|BALANCESEXPORTCATEGORIESSUB)$' 
ancak tam table_name kullanım şey eşleştirmek istiyorsanız

^ dizenin başında eşleşir. Dizenin sonunda

$ eşleşir.

Ayrıntılar here.

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

IN harf duyarsız hale getirmek için:

Alternatif gibi bir şey kullanabilirsiniz.

+0

+1 iyi çözümler! – acdcjunior

+0

+1, çözümü normal ifadesiz sağladığınız için –