2012-07-10 66 views
5

Cột trong một bảng cơ sở dữ liệu SQL Server của tôi chứa đường dẫn (không phải đường dẫn tệp, chỉ đường dẫn thư mục).Tìm thư mục con của đường dẫn tệp từ bảng đường dẫn tệp bằng chức năng "LIKE" của SQL Server

Tôi hiện đang có truy vấn trả về tất cả các thư mục con của đường dẫn tệp đã cho, sử dụng hàm LIKE;

WHERE Path LIKE @FilePath + '%' 

Lưu ý rằng có vấn đề với phương pháp này là ký tự thoát tệp được sử dụng bởi tất cả các ký tự đường dẫn tệp hợp lệ. Tôi sẽ sử dụng đúng ESCAPE trong truy vấn đã hoàn thành.

Dù sao, hãy quay lại câu hỏi của tôi. Tôi muốn có thể sửa đổi truy vấn để truy vấn chỉ trực tiếp các thư mục con của đường dẫn được chỉ định. Điều này không dễ dàng như chỉ việc đặt dấu gạch chéo ở cuối chuỗi, vì rõ ràng là% wildcard gobbles mọi thứ khi nó phân tích phần bên phải của chuỗi.

Tôi đang xem xét sử dụng trình tự thoát [^], có thể thực hiện tìm kiếm không bao gồm ký tự \ nhưng tôi không may mắn với điều đó. Tôi đã thử điều này;

WHERE Path LIKE @FilePath + '[^\]' 

Nhưng nó không tạo ra kết quả mong muốn, vì vậy tôi thậm chí không chắc mình có sử dụng đúng cách hay không.

Trả lời

2

Đừng sử dụng LIKE cho việc này. LEFT và SUBSTRING sẽ cho hiệu suất tốt hơn vì bạn không thực hiện bất kỳ tìm kiếm ký tự đại diện nào, bạn nên thử và tránh trong mọi trường hợp.

Truy vấn bên dưới sẽ thực hiện việc này và loại trừ khớp chính xác, vì vậy nếu có thư mục 'C: \ Temp \ nó sẽ không hiển thị trong kết quả, nhưng tất cả các thư mục phụ sẽ.

Những gì chúng tôi đang làm là vứt bỏ tất cả các kết quả có thể có nhiều thư mục phụ hơn ('\') và chỉ sử dụng các thư mục con có một thư mục con duy nhất.

Hy vọng điều này sẽ hữu ích!

DECLARE @directory VARCHAR(150); 
SET @directory = 'C:\Temp\'; 

SELECT 
    * 
FROM 
    tblDir 
WHERE 
    LEFT(Dir, LEN(@directory)) = @directory 
    AND CHARINDEX('\', SUBSTRING(Dir, LEN(@directory) ,LEN(Dir) - LEN(@directory)), 2) = 0 
    AND Dir <> @directory 
+0

Bằng cách áp dụng chức năng cho cột, bạn thực hiện truy vấn không hiệu quả (http://en.wikipedia.org/wiki/Sargable). Mặt khác, 'LIKE' chống lại một mẫu bắt đầu bằng một chuỗi cố định (trái ngược với các ký tự mặt nạ và các biểu thức như'% ',' _' và '[...]') vẫn có thể cho phép một chỉ mục thích hợp được dùng. –

+0

Trong trường hợp của tôi là Andriy, cột là NVARCHAR (MAX), vì vậy nó không được lập chỉ mục. Điểm tốt mặc dù. @Charl Lamprecht - cảm ơn câu trả lời của bạn, việc sử dụng LEFT tiết kiệm cho tôi những rắc rối của việc phải đối phó với các ký tự thoát của các nhà điều hành LIKE - cổ vũ! –

3

Đây là một cách để làm điều này mà không cần NHƯ:

WHERE left(Path, len(@FilePath)) = @FilePath and 
     charindex('\', substr(Path, len(@FilePath)+2, 1000)) = 0 

(Phần đầu của báo cáo kết quả cũng giống như "con đường như @FilePath + '%'").

Phần thứ hai chỉ xem chuỗi và kiểm tra rằng không có dấu gạch chéo ngược sau @FilePath (có lẽ ký tự tiếp theo là dấu gạch chéo ngược).

Nếu bạn thích THÍCH, bạn có thể viết những dòng này như:

where Path like @FilePath + '%' and 
     Path not like @FilePath + '%[\]%' 
Các vấn đề liên quan