Cột không thích nhiều giá trị


8

Tôi đang cố gắng chọn các bản ghi trong db postgresql nơi tên người dùng không giống như một danh sách các chuỗi.

SELECT * FROM rails_db WHERE username NOT LIKE 'j%' AND username NOT LIKE '%eepy%';

Vấn đề là có rất nhiều giá trị này. Có cách nào để tạo ra một mảng trong số đó và nói điều gì đó như:

SELECT * FROM rails_db WHERE username NOT LIKE ARRAY[my values];

Câu trả lời:


12

Bạn gần như đã có cú pháp chính xác. Đây chính xác là những gì bạn muốn:

SELECT * FROM rails_db WHERE username NOT LIKE ALL(ARRAY[my values]);

Đây là một cú pháp rất hay, nhưng nó sẽ không nhất thiết phải nhanh, đặc biệt là nếu mảng lớn. Tuy nhiên, những gì bạn muốn là khó để tối ưu hóa cho hiệu suất, và không có lý do gì để nghĩ rằng các cú pháp xấu hơn sẽ nhanh hơn.


Điều gì sẽ xảy ra nếu tôi tạo một bảng tạm thời và thay vào đó tham gia vào đó? Điều đó sẽ nhanh hơn / hiệu quả hơn?
Jeff

Tôi không nghĩ rằng một bảng tạm thời sẽ nhanh hơn. Vấn đề là "không thích" không thực sự có thể lập chỉ mục và không có gì có thể thay đổi điều đó. Có lẽ hình thức tối ưu hóa dễ tiếp cận nhất sẽ là đặt chuỗi được chọn nhiều nhất (loại không bao gồm nhiều hàng nhất) làm chuỗi đầu tiên trong mảng / danh sách.
jjanes

1

Tôi có thể đã tìm thấy nó, nhưng tôi muốn xem nếu nó hoạt động theo cách nó được cho là:

SELECT * FROM rails_db WHERE username !~* 'j.*|.*eepy.*';

Điều này dường như không hoạt động khi tôi muốn loại trừ những thứ có dấu chấm trong đó:'j.*|...|\.'
Jeff

1
Có một vài quan niệm sai lầm ở đây. Tôi đã thêm một câu trả lời.
Erwin Brandstetter

1

Ý tưởng của bạn về việc sử dụng một biểu thức chính quy với các nhánh là vững chắc. Nhưng trong câu trả lời của bạn, bạn đã dịch sai ký tự đặc biệt %theo LIKEmẫu.

Điều này:

... WHERE username NOT LIKE 'j%' AND username NOT LIKE '%eepy%';

Dịch sang:

... WHERE username !~ '^j|eepy';

!~Là trường hợp nhạy cảm như thế nào NOT LIKE.
Sử dụng !~*để phù hợp với trường hợp không nhạy cảm như NOT ILIKE.
Để loại trừ các chuỗi chứa một dấu chấm ( .) ở bất cứ đâu và với một ví dụ khác khớp (không khớp) ở cuối chuỗi như username NOT LIKE '%end':

... WHERE username !~ '^j|end$|eepy|\.';

Có lẽ cũng không nhanh lắm.


0
with help(term) as (values('T%'),('STAG%'))
select tabschema, tabname
from syscat.indexes
where not exists (select 1 from help where tabschema like term)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.