2011-01-31 27 views
10

Tôi cần phải lọc ra các bản ghi dựa trên một số kết hợp văn bản trong cột nvarchar (1000). Bảng có hơn 400 nghìn bản ghi và đang phát triển. Hiện tại, tôi đang sử dụng Điều kiện thích: -Cách sử dụng như điều kiện với nhiều giá trị trong máy chủ sql 2005?

SELECT 
    * 
FROM 
    table_01 
WHERE 
    Text like '%A1%' 
    OR Text like '%B1%' 
    OR Text like '%C1%' 
    OR Text like '%D1%' 

Có công việc nào được ưa thích xung quanh không?

+4

Bạn ** biết ** rằng việc sử dụng thao tác 'LIKE '% A1%'' chắc chắn sẽ vô hiệu hóa mọi chỉ mục sử dụng và do đó dẫn đến việc quét toàn bộ bảng ** được bảo đảm ** mỗi lần ... –

Trả lời

0

Nếu bạn có thể tạo một FULLTEXT INDEX trên cột đó trong bảng của bạn (giả định rất nhiều nghiên cứu về hiệu suất và không gian), thì có thể bạn sẽ thấy một cải tiến lớn về hiệu suất trên khớp văn bản. Bạn có thể truy cập vào số điện thoại link này để xem những gì FULLTEXT SEARCH là và điều này link để xem cách tạo một FULLTEXT INDEX.

+0

Lưu lại nhớ rằng lập chỉ mục toàn văn là từ dựa trong khi LIKE đang tìm kiếm một mẫu ký tự trong một chuỗi. Như một ví dụ cụ thể, tìm kiếm toàn văn cho 'công việc' sẽ không tìm thấy từ trong 'làm việc quá sức', nhưng một mệnh đề LIKE sẽ. –

8
SELECT 
    * 
FROM 
    table_01 
WHERE 
    Text like '%[A-Z]1%' 

này sẽ kiểm tra nếu các văn bản chứa A1, B1, C1, D1, ...

tham khảo để sử dụng Like Condition in SQL Server

+5

Tôi có cảm giác rằng bạn đã lấy mã mẫu cho một chút quá theo nghĩa đen. –

+0

@Joe Stefanelli ... Có lẽ tôi có nhưng tất cả OP được đề cập là một "cách giải quyết ưa thích" Đây rõ ràng là một cách. Nếu đó là hiệu suất thì FullText Indicies có thể hữu ích. –

4

Có một cái nhìn tại NHƯ trên msdn.

Bạn có thể giảm bộ lọc số bằng cách kết hợp thêm chi tiết vào một mệnh đề LIKE.

SELECT 
    * 
FROM 
    table_01 
WHERE 
    Text like '%[ABCD]1%' 
+5

Tôi có cảm giác bạn đã lấy mã mẫu cho một chút quá theo nghĩa đen. –

+1

Không thực sự. Truy vấn được cung cấp sẽ chỉ làm tương tự như bản gốc. Liên kết MSDN giải thích tại sao. – msms

+1

Tôi có thể sai, nhưng tôi nghi ngờ A1, B1, vv chỉ là phần giữ chỗ giả cho các chuỗi thực đang được tìm kiếm. –

5

Bạn có thể thử những điều sau nếu bạn biết vị trí chính xác của chuỗi tiểu của bạn:

SELECT 
    * 
FROM 
    table_01 
WHERE 
    SUBSTRING(Text,1,2) in ('B1','C1','D1') 
+0

Sau một số nghiên cứu, LIKE() có vẻ hoạt động tốt hơn SUBSTRING(). – mbrownnyc

0

tôi cần phải làm điều này vì vậy mà tôi có thể cho phép hai cơ sở dữ liệu khác nhau trong một bộ lọc cho cột DatabaseName trong Mẫu Bản ghi Hồ sơ Máy chủ SQL.

Tất cả những gì bạn có thể làm là điền vào phần nội dung của mệnh đề Like.

Sử dụng tham chiếu trong John Hartscock's answer, tôi phát hiện ra rằng mệnh đề tương tự sử dụng một loại mẫu regex có giới hạn.

Đối với trường hợp của OP, MSMS has the solution.

Giả sử tôi muốn cơ sở dữ liệu ABCOne, ABCTwo, và ABCThree, tôi đưa ra những gì về bản chất là danh sách cho phép độc lập cho mỗi nhân vật:

Like ABC[OTT][NWH][EOR]% 

Đó là một cách dễ dàng mở rộng cho bất kỳ thiết lập các chuỗi. Nó sẽ không được ironclad, rằng mô hình cuối cùng cũng sẽ phù hợp với ABCOwe, ABCTnr, hoặc ABCOneHippotamus, nhưng nếu bạn lọc một tập hợp hạn chế các giá trị có thể có một cơ hội tốt, bạn có thể làm cho nó hoạt động.

Hoặc bạn có thể sử dụng toán tử [^] để trình bày danh sách đen các ký tự không được chấp nhận.

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