2009-01-13 37 views
157

Tôi đang cố gắng lọc các mục bằng quy trình được lưu trữ sử dụng như thế nào. Cột này là một varchar (15). Các mục tôi đang cố gắng lọc có dấu ngoặc vuông trong tên.Làm cách nào để thoát khỏi các dấu ngoặc vuông trong mệnh đề LIKE?

Ví dụ: WC[R]S123456.

Nếu tôi thực hiện LIKE 'WC[R]S123456', nó sẽ không trả lại bất cứ điều gì.

Tôi đã tìm thấy một số thông tin về cách sử dụng từ khóa ESCAPE với LIKE nhưng tôi không hiểu cách sử dụng từ khóa đó để xử lý các dấu ngoặc vuông làm chuỗi thông thường.

+0

Câu hỏi của bạn có ít nhất '5' phiếu cho [tag: như-điều hành] thẻ. Tôi có thể vui lòng yêu cầu bạn đề xuất [tag: sql-like] làm [từ đồng nghĩa] (http://stackoverflow.com/tags/like-operator/synonyms) không? – Kermit

Trả lời

216
LIKE 'WC[[]R]S123456' 

hoặc

LIKE 'WC\[R]S123456' ESCAPE '\' 

nên làm việc.

+6

Từ khóa ESCAPE là bắt buộc nếu bạn muốn sử dụng ký tự thoát tùy chỉnh (dấu gạch chéo ngược thực sự là tùy chỉnh). –

+3

@RyanKohn: http://meta.stackexchange.com/q/153241 –

+1

Cảm ơn bạn đã sửa, @Ryan. – Shog9

17

Dưới đây là những gì tôi thực sự được sử dụng:

like 'WC![R]S123456' ESCAPE '!' 
8

Từ khóa ESCAPE được sử dụng nếu bạn cần phải tìm kiếm cho các ký tự đặc biệt như% và _, mà thường thẻ hoang dã. Nếu bạn chỉ định ESCAPE, SQL sẽ tìm kiếm theo nghĩa đen cho các ký tự% và _.

Here's a good article with some more examples

SELECT columns FROM table WHERE 
    column LIKE '%[[]SQL Server Driver]%' 

-- or 

SELECT columns FROM table WHERE 
    column LIKE '%\[SQL Server Driver]%' ESCAPE '\' 
23

tôi cần phải loại trừ những cái tên bắt đầu với một dấu gạch dưới từ một truy vấn, vì vậy tôi đã kết thúc với điều này:

WHERE b.[name] not like '\_%' escape '\' -- use \ as the escape character 
+1

Tôi đã phải sử dụng phiên bản này (chỉ định ký tự "thoát" một cách rõ ràng) - các câu trả lời khác ở đây không đưa ra kết quả chính xác cho tôi. – MarcE

71

Hãy nói rằng bạn muốn để phù hợp với nghĩa đen its[brac]et.

Bạn không cần phải thoát khỏi ] vì nó có ý nghĩa đặc biệt chỉ khi nó được ghép nối với [.

Do đó thoát [ đủ để giải quyết vấn đề. Bạn có thể thoát khỏi [bằng cách thay thế bằng[[].

+5

Điều này thực sự hữu ích và là câu trả lời hay nhất. –

+5

[[] thật kỳ lạ! Nhưng cảm ơn! –

2

Thay vì '\' hoặc một ký tự khác trên bàn phím, bạn cũng có thể sử dụng các ký tự đặc biệt không có trên bàn phím. Tùy thuộc vào trường hợp sử dụng của bạn, điều này có thể cần thiết, nếu bạn không muốn sử dụng đầu vào của người dùng vô tình làm ký tự thoát.

+1

Tôi thường sử dụng '¬' - nó vẫn là ký tự bàn phím ở Anh nhưng hiếm khi được sử dụng một cách có hiểu biết :) (trên cùng bên trái giữa' Esc' và 'Tab') –

1

Nếu bạn cần loại bỏ các ký tự đặc biệt như '_' (gạch dưới), như trong trường hợp của tôi và bạn không sẵn sàng/không thể xác định mệnh đề ESCAPE, bạn có thể gửi kèm theo ký tự có dấu ngoặc vuông '['']'.

này giải thích ý nghĩa của "lạ" chuỗi '[[]' - nó chỉ bao trùm '[' nhân vật với dấu ngoặc vuông, có hiệu quả thoát nó.

Trường hợp sử dụng của tôi là chỉ định tên của một thủ tục được lưu với dấu gạch dưới trong đó làm tiêu chí lọc cho Profiler.Vì vậy, tôi đã đặt chuỗi '% name [_] của [_] một [_] được lưu trữ [_] thủ tục%' trong trường LIKE TextData và nó cho tôi kết quả theo dõi tôi muốn đạt được.

Đây là một ví dụ điển hình từ các tài liệu: LIKE (Transact-SQL) - Using Wildcard Characters As Literals

1

Theo documentation:

Bạn có thể sử dụng các mẫu ký tự đại diện phù hợp với nhân vật như đen ký tự. Để sử dụng ký tự đại diện làm ký tự chữ, hãy kèm theo ký tự đại diện trong dấu ngoặc vuông.

Bạn cần phải thoát khỏi ba nhân vật %_[:

'5%'  LIKE '5[%]'  -- true 
'5$'  LIKE '5[%]'  -- false 
'foo_bar' LIKE 'foo[_]bar' -- true 
'foo$bar' LIKE 'foo[_]bar' -- false 
'foo[bar' LIKE 'foo[[]bar' -- true 
'foo]bar' LIKE 'foo]bar' -- true 
Các vấn đề liên quan