2013-07-02 37 views
7

Tôi muốn chỉ nhận được các bản ghi có một số từ tại một cột, tôi đã thử sử dụng WHERE ... IN (...) nhưng Postgres phân biệt chữ hoa chữ thường trong mệnh đề where. Đây là lý do tại sao tôi đã thử dùng toán tử regex và ~*.Regex để tìm các từ hoàn chỉnh tại Postgresql

Sau đây là đoạn mã SQL trả về tất cả các cột và bảng từ DB, tôi muốn hạn chế các hàng để chỉ hiển thị các bảng trong biểu thức 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 

Regex này sẽ mang tất cả các cột BALANCES và cột của bảng chứa từ khóa 'BALANCES'.

Tôi muốn giới hạn kết quả chỉ khi hoàn thành tên.

Trả lời

7

Sử dụng các regex, giải pháp chung là sử dụng word boundaries trước và sau biểu thức hiện tại.

Xem hiệu lực thi hành mà không: http://regexr.com?35ecl

Xem tác dụng với ranh giới từ: http://regexr.com?35eci

Trong PostgreSQL, the word boundaries are denoted by \y(động cơ regex phổ biến khác, chẳng hạn như PCRE, C# và Java, sử dụng \b thay vì - do đó việc sử dụng nó trong bản demo regex ở trên - cảm ơn @IgorRomanchenko).

Như vậy, đối với trường hợp của bạn, khái niệm dưới đây có thể được sử dụng (các trận đấu cũng giống như ví dụ regexes trong các liên kết ở trên):

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

Xem demo của biểu thức này được sử dụng ở đây: http://sqlfiddle.com/#!12/9f597/1

+0

Trong Postgres '\ b' có nghĩa là' backspace, như trong C'. Bạn có thể sử dụng '\ y' cho' các kết quả phù hợp ở đầu hoặc cuối của từ'. Chi tiết ['here'] (http://www.postgresql.org/docs/current/static/functions-matching.html) –

+0

@IgorRomanchenko Vâng, cảm ơn bạn đã chỉ ra! – acdcjunior

+0

Pedantic, nhưng tôi muốn nói "nhiều công cụ regex khác" thay vì "regexes thông thường" - regexes không thực sự được chuẩn hóa, vì vậy tốt nhất nên tìm hướng dẫn cho bất kỳ "hương vị" nào mà một công cụ cụ thể chạy thay vì đưa ra bất kỳ giả định nào. – IMSoP

3

Nếu bạn muốn kết hợp chỉ toàn table_name sử dụng một cái gì đó giống như

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

^ đối sánh ở đầu chuỗi.

$ kết quả phù hợp ở cuối chuỗi.

Chi tiết here.

Hoặc bạn có thể sử dụng một cái gì đó như:

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

để làm IN trường hợp nhạy cảm.

+0

+1 giải pháp tốt! – acdcjunior

+0

+1 vì bạn đã cung cấp giải pháp không có regex –

Các vấn đề liên quan