Danh sách các ký tự đặc biệt cho mệnh đề SQL LIKE


119

Danh sách đầy đủ của tất cả các ký tự đặc biệt cho SQL là gì (Tôi quan tâm đến SQL Server nhưng cái khác cũng tốt) mệnh đề LIKE?

Ví dụ

SELECT Name FROM Person WHERE Name LIKE '%Jon%'

Máy chủ SQL :

  1. %
  2. _
  3. [specifier] Ví dụ: [az]
  4. [^ specifier]
  5. Mệnh đề ESCAPE, ví dụ:% 30! %% 'ESCAPE'! ' sẽ đánh giá 30% là đúng
  6. 'ký tự cần được thoát bằng' Ví dụ: họ trở thành họ '

MySQL:

  1. % - Bất kỳ chuỗi nào không hoặc nhiều ký tự.
  2. _ - Bất kỳ ký tự đơn nào
  3. Mệnh đề ESCAPE, ví dụ:% 30! %% 'ESCAPE'! ' sẽ đánh giá 30% là đúng

Oracle:

  1. % - Bất kỳ chuỗi nào không hoặc nhiều ký tự.
  2. _ - Bất kỳ ký tự đơn nào
  3. Mệnh đề ESCAPE, ví dụ:% 30! %% 'ESCAPE'! ' sẽ đánh giá 30% là đúng

Sybase

  1. %
  2. _
  3. [specifier] Ví dụ: [az]
  4. [^ specifier]

Phát triển:

  1. % - Bất kỳ chuỗi nào không hoặc nhiều ký tự.
  2. _ - Bất kỳ ký tự đơn nào

    Hướng dẫn tham khảo tại đây [PDF]

PostgreSQL:

  1. % - Bất kỳ chuỗi nào không hoặc nhiều ký tự.
  2. _ - Bất kỳ ký tự đơn nào
  3. Mệnh đề ESCAPE, ví dụ:% 30! %% 'ESCAPE'! ' sẽ đánh giá 30% là đúng

ANSI SQL92:

  1. %
  2. _
  3. Một ký tự ESCAPE chỉ khi được chỉ định .

PostgreSQL cũng có SIMILAR TOtoán tử bổ sung như sau:

  1. [specifier]
  2. [^specifier]
  3. | - một trong hai lựa chọn thay thế
  4. * - sự lặp lại của mục trước đó không hoặc nhiều lần.
  5. + - sự lặp lại của mục trước đó một hoặc nhiều lần.
  6. () - nhóm các mục với nhau

Ý tưởng là biến đây thành một Wiki cộng đồng có thể trở thành "Một cửa hàng" cho việc này.


Điều đáng nói là điều khoản ESCAPE. SQL Server, Oracle và MySQL đều hỗ trợ điều này. Không biết về Sybase.
Dave Webb

Tôi đang nghĩ bây giờ là khoản ESCAPE là SQL tiêu chuẩn như vậy có lẽ chỉ cần nhắc đến một lần
Dave Webb

Bản thân tôi không biết rằng nó được triển khai trong tất cả các máy chủ được liệt kê (và bất kỳ máy chủ nào có thể được bổ sung sau này) nên tôi rất miễn cưỡng đưa nó vào phần "Tất cả hỗ trợ". Nếu bạn tự tin rằng tất cả họ đều được hỗ trợ thì hãy tiếp tục.
Jonathan Parker

Đừng quên để thoát khỏi nhân vật chạy thoát thân ...
Christoffer Hammarström

Hai nhận xét. Đầu tiên, Microsoft SQL ban đầu xuất phát từ Sybase, vì vậy sự giống nhau không phải là ngẫu nhiên. Thứ hai, thoát khỏi một trích dẫn duy nhất với một trích dẫn khác không giới hạn ở LIKE; ví dụ WHERE familyname = 'O''Toole'. Thứ ba, SIMILAR TOtoán tử giới thiệu một loại biểu thức chính quy kết hợp, có các tính năng riêng của nó (và nhiều ký tự đặc biệt hơn), vì vậy có lẽ không nên đưa vào đây. Tôi đoán điều đó đưa ra 3 nhận xét, nhưng không ai mong đợi Tòa án Dị giáo Tây Ban Nha.
Manngo

Câu trả lời:


22

Đối với SQL Server, từ http://msdn.microsoft.com/en-us/library/ms179859.aspx :

  • % Bất kỳ chuỗi không hoặc nhiều ký tự.

    WHERE title LIKE '%computer%' tìm tất cả các tên sách có từ 'máy tính' ở bất kỳ đâu trong tên sách.

  • _ Một ký tự bất kỳ.

    WHERE au_fname LIKE '_ean' tìm tất cả các tên có bốn chữ cái kết thúc bằng ean (Dean, Sean, v.v.).

  • [] Bất kỳ ký tự đơn lẻ nào trong phạm vi được chỉ định ([af]) hoặc tập hợp ([abcdef]).

    WHERE au_lname LIKE '[C-P]arsen'tìm họ của tác giả kết thúc bằng arsen và bắt đầu bằng bất kỳ ký tự đơn nào giữa C và P, ví dụ Carsen, Larsen, Karsen, v.v. Trong tìm kiếm theo phạm vi, các ký tự được bao gồm trong phạm vi có thể khác nhau tùy thuộc vào các quy tắc sắp xếp của đối chiếu.

  • [^] Bất kỳ ký tự đơn lẻ nào không nằm trong phạm vi được chỉ định ([^ af]) hoặc tập hợp ([^ abcdef]).

    WHERE au_lname LIKE 'de[^l]%' tất cả họ của tác giả bắt đầu bằng de và trong đó chữ cái sau không phải là l.


1
Tôi vừa thử và có vẻ như bạn có thể làm được. Nhưng nó không giống như biểu thức chính quy => [0-9] Thay vào đó, bạn cần chỉ định từng ký tự như sau: [0123456789]
Çağdaş Tekin

3
Chờ đã, không. Nó giống như RegEx nên [0-9] cũng hoạt động. Xin lỗi vì sự nhầm lẫn.
Çağdaş Tekin

6

ANSI SQL92 :

  • %
  • _
  • một ký tự ESCAPE chỉ khi được chỉ định .

Thật đáng thất vọng là nhiều cơ sở dữ liệu không tuân theo các quy tắc tiêu chuẩn và thêm các ký tự thừa hoặc kích hoạt không chính xác ESCAPE với giá trị mặc định là '\' khi nó bị thiếu. Giống như chúng ta chưa gặp đủ rắc rối với '\'!

Không thể viết mã độc lập với DBMS ở đây, bởi vì bạn không biết mình sẽ phải thoát ký tự nào và tiêu chuẩn nói rằng bạn không thể thoát khỏi những thứ không cần phải thoát. (Xem phần 8.5 / Quy tắc chung / 3.a.ii.)

Cảm ơn bạn SQL! gnnn


5

Bạn nên thêm rằng bạn phải thêm phần bổ sung 'để thoát khỏi một sự cố' trong SQL Server:

smith's -> smith''s


1

Sybase:

%              : Matches any string of zero or more characters.
_              : Matches a single character.
[specifier]    : Brackets enclose ranges or sets, such as [a-f] 
                 or [abcdef].Specifier  can take two forms:

                 rangespec1-rangespec2: 
                   rangespec1 indicates the start of a range of characters.
                   - is a special character, indicating a range.
                   rangespec2 indicates the end of a range of characters.

                 set: 
                  can be composed of any discrete set of values, in any 
                  order, such as [a2bR].The range [a-f], and the 
                  sets [abcdef] and [fcbdae] return the same 
                  set of values.

                 Specifiers are case-sensitive.

[^specifier]    : A caret (^) preceding a specifier indicates 
                  non-inclusion. [^a-f] means "not in the range 
                  a-f"; [^a2bR] means "not a, 2, b, or R."

0

Câu trả lời tiềm năng cho SQL Server

Thật thú vị, tôi vừa chạy một bài kiểm tra bằng cách sử dụng LinqPad với SQL Server. Máy chủ này sẽ chỉ chạy Linq to SQL bên dưới và nó tạo ra câu lệnh SQL sau.

Bản ghi .Where (r => r.Name.Contains ("lkjwer --_ ~ []"))

-- Region Parameters
DECLARE @p0 VarChar(1000) = '%lkjwer--~_~~~[]%'
-- EndRegion
SELECT [t0].[ID], [t0].[Name]
FROM [RECORDS] AS [t0]
WHERE [t0].[Name] LIKE @p0 ESCAPE '~'

Vì vậy, tôi chưa thử nghiệm nó nhưng có vẻ như ESCAPE '~'từ khóa có thể cho phép tự động thoát chuỗi để sử dụng trong một biểu thức like.


Họ có thể chỉ sử dụng ESCAPEvì nó cho phép sử dụng hai ký tự trên mỗi nhân vật thoát (ví dụ, %trở thành ~%) thay vì ba (ví dụ, mà không ESCAPE, %trở nên [%]).
binki
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.