Làm thế nào tôi có thể thoát dấu ngoặc vuông trong mệnh đề THÍCH?


235

Tôi đang cố gắng lọc các mục với một thủ tục được lưu trữ bằng cách sử dụng like. Cột 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.

Ví dụ : WC[R]S123456.

Nếu tôi làm điều LIKE 'WC[R]S123456'đó 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ề việc sử dụng ESCAPEtừ khóa LIKEnhưng tôi không hiểu cách sử dụng từ khóa này để coi dấu ngoặc vuông là một chuỗi thông thường.

Câu trả lời:


327
LIKE 'WC[[]R]S123456' 

hoặc là

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

Nên làm việc.


10
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).
Ryan Kohn

2
Tôi cũng sửa phần khác của câu trả lời. SQL Fiddle với các phiên bản trước và sau
Martin Smith

10
Nếu bất cứ ai không rõ ràng về lý do tại sao khung cần phải được thoát, tài liệu cho THÍCH chỉ ra rằng nó được sử dụng để khớp với một ký tự trong phạm vi hoặc tập hợp. Ví dụ: sử dụng LIKE '[fz]oo'sẽ khớp với cả 'foo' và 'zoo'.
Nhà phát triển toàn diện

3
Nó sẽ là tốt đẹp để có lý do cho cả hai trong câu trả lời. Nó không rõ ràng ngay lập tức với tôi tại sao ví dụ đầu tiên sẽ hoạt động cho đến khi tôi đọc câu trả lời từ Amitesh bên dưới.
Don Jewett

1
Thích hơn LIKE 'WC\[R]S123456' ESCAPE '\'vì nó dễ đọc hơn để bảo trì.
Lửa Druid

118

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 ]vì nó chỉ có ý nghĩa đặc biệt khi nó được ghép nối với [.

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


7
Điều này thực sự hữu ích và imo câu trả lời tốt nhất.
Jared Sol

1
[[]trông có vẻ kỳ lạ, nhưng nó có ý nghĩa khi bạn nhìn nó từ quan điểm của trình phân tích cú pháp. Trình phân tích cú pháp có một quy tắc cụ thể về cách xử lý các ký tự giữa [ ]. Vì vậy, văn bản its[brac]etcó nghĩa là: "Tìm các chuỗi liên tiếp sau : its, (áp dụng quy tắc cho dấu ngoặc vuông brac:), et" . Mặt khác, its[[]brac]etcó nghĩa là: "Tìm các chuỗi liên tiếp sau : its, (áp dụng quy tắc cho dấu ngoặc vuông [:), brac]et" .
Brian

28

Tôi cần loại trừ các tên bắt đầu bằng dấu gạch dưới khỏi truy vấn, vì vậy tôi đã kết thúc bằng tên này:

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

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

20

Đây là những gì tôi thực sự sử dụng:

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

15

Từ khóa ESCAPE được sử dụng nếu bạn cần tìm kiếm các ký tự đặc biệt như% và _, thường là các 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à _.

Đây là một bài viết tốt với một số ví dụ

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

-- or 

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

6

Nếu bạn cần thoát 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ể muốn đặt ký tự đặc biệt bằng dấu ngoặc vuông '[ ''] ' .

Điều này giải thích ý nghĩa của chuỗi "kỳ lạ" '[[]' - nó chỉ ôm lấy ký tự '[' với dấu ngoặc vuông, thoát khỏi nó một cách hiệu quả.

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 trữ 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 [_] thủ tục được lưu trữ [_]%' trong trường TextData THÍCH và nó cho tôi kết quả theo dõi mà tôi muốn đạt được.

Dưới đây là một ví dụ hay từ tài liệu: THÍCH (Transact-SQL) - Sử dụng các ký tự đại diện làm chữ


4

Theo tài liệu :

Bạn có thể sử dụng mẫu ký tự đại diện khớp với các ký tự như các ký tự bằng chữ. Để sử dụng ký tự đại diện làm ký tự chữ, hãy đặt ký tự đại diện trong ngoặc.

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

'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

1

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 đầu vào của người dùng vô tình được sử dụng làm ký tự thoát.


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

Người dùng vẫn có thể gửi dữ liệu chứa các chữ cái không có trên bàn phím. Câu trả lời này nghe có vẻ đáng ngờ giống như một lời đề nghị để tránh thực sự giải quyết vấn đề
Lôi

0

Sử dụng sau đây.

Đối với đầu vào của người dùng để tìm kiếm, hãy sử dụng esc, theo đó nó sẽ yêu cầu thay thế sau cho tất cả các ký tự đặc biệt (bên dưới bao gồm tất cả SQL Server).

Ở đây trích dẫn đơn "'" không được thực hiện vì nó không ảnh hưởng đến mệnh đề like vì đây là vấn đề nối chuỗi.

Thay thế "-" & "^" & "]" là không bắt buộc vì chúng tôi đang thoát "[".

String FormattedString = "UserString".Replace("ð","ðð").Replace("_", "ð_").Replace("%", "ð%").Replace("[", "ð[");

Sau đó, trong SQL Query, nó sẽ như sau. (Trong truy vấn được tham số hóa, chuỗi có thể được thêm bằng các mẫu sau khi thay thế ở trên).

Để tìm kiếm chuỗi chính xác.

like 'FormattedString' ESCAPE 'ð'

Để tìm kiếm bắt đầu bằng chuỗi

like '%FormattedString' ESCAPE 'ð'

Để tìm kiếm kết thúc bằng chuỗi

like 'FormattedString%' ESCAPE 'ð'

Để tìm kiếm có chứa chuỗi

like '%FormattedString%' ESCAPE 'ð'

và như vậy cho phù hợp với mô hình khác. Nhưng đầu vào người dùng trực tiếp cần định dạng như đã đề cập ở trên.


0

Có một vấn đề trong đó:

LIKE 'WC[[]R]S123456' 

và:

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

Cả hai đều hoạt động cho SQL Server nhưng không hoạt động cho Oracle.

Dường như không có cách ISO / IEC 9075 để nhận ra một mẫu liên quan đến nẹp trái.

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.