2013-12-13 17 views
5

Hãy nói rằng tôi có một bảng:SQL: Tại sao LIKE không hoạt động nếu lớp nhân vật [0-9] được sử dụng?

bảng hiện tại:

title_id  title_name    title_qty 
    1  A.I. Artificial Intelligence  2 
    2  Batman Begins     40 
    3  2012        7 
    4  101 Dalmatians     23 
    5  Act of Valor      1 
    6  Batman       50 
    7  20 Million Miles to Earth  340 

Tôi muốn có một sản lượng:

đầu ra mong muốn:

title_id  title_name    title_qty title_char 
     4   101 Dalmatians    23   # 
     7   20 Million Miles to Earth  340   # 
     3    2012     7   # 
     1   A.I. Artificial Intelligence 2   A 
     5   Act of Valor     1   A 
     6   Batman      50   B 
     2   Batman Begins     40   B 

Dựa trên những gì tôi đọc ở đây trong Stack Overflow, cách nhanh nhất để chec k nếu một nhân vật là một con số là sử dụng LIKE '[0-9]%' vì vậy tôi đã đưa ra

Query:

SELECT *, CASE KHI LEFT (TITLE_NAME, 1) NHƯ '[0-9]%' THEN "#" ELSE LEFT (TITLE_NAME, 1) END như title_char TỪ tiêu đề ORDER BY TITLE_NAME

Output:

title_id  title_name    title_qty title_char 
    4   101 Dalmatians    23   1 
    7   20 Million Miles to Earth  340   2 
    3    2012     7   2 
    1   A.I. Artificial Intelligence 2   A 
    5   Act of Valor     1   A 
    6   Batman      50   B 
    2   Batman Begins     40   B 

Như được hiển thị ở trên, nó không hoạt động chút nào. Nhưng nếu tôi thay đổi tương tự để phù hợp với một chữ số duy nhất, nó hoạt động:

SELECT *, CASE KHI LEFT (TITLE_NAME, 1) LIKE '1%' THEN "#" ELSE LEFT (TITLE_NAME, 1) END như title_char TỪ tiêu đề ORDER BY TITLE_NAME

title_id  title_name    title_qty title_char 
    4   101 Dalmatians    23   # 
    7   20 Million Miles to Earth  340   2 
    3    2012     7   2 
    1   A.I. Artificial Intelligence 2   A 
    5   Act of Valor     1   A 
    6   Batman      50   B 
    2   Batman Begins     40   B 

tôi ban đầu nghĩ rằng nó không hoạt động vì truy vấn của tôi là một chút phức tạp vì vậy tôi đã làm một đơn giản Chọn nơi. LIKE được thêm sau WHERE.

Không đầu ra (khi có nên được ba):

SELECT * FROM title WHERE title_name LIKE '[0-9]%' ORDER BY title_name 

làm việc như mong đợi:

SELECT * FROM title WHERE title_name LIKE '1%' ORDER BY title_name 

SELECT * FROM title WHERE title_name LIKE '2%' ORDER BY title_name 

Theo tài liệu SQL,

Một nhân vật lớp “[...]” khớp với bất kỳ ký tự nào trong dấu ngoặc đơn. Ví dụ: “[abc]” khớp với “a”, “b” hoặc “c”. Để đặt tên cho một dải gồm ký tự, hãy sử dụng dấu gạch ngang. “[A-z]” khớp với bất kỳ chữ cái nào, trong khi “[0-9]” khớp với bất kỳ chữ số nào.

Bất cứ ai cũng biết tại sao nó không hoạt động nếu bạn sử dụng lớp nhân vật [0-9]? Là người mới bắt đầu, hãy làm đúng nếu tôi sai. Nhưng tôi tò mò tại sao nó hoạt động nếu tôi sử dụng LIKE '1%' hoặc bất kỳ chữ số nào trong khi LIKE '[0-9]%' sẽ không đưa ra bất kỳ kết quả nào? Tài liệu nói rằng nó phải phù hợp với bất kỳ chữ số nào? Nếu đúc nó như là số nguyên là một yêu cầu nó không nên làm việc trên tất cả các bài kiểm tra của tôi, phải không?Bởi vì tôi không bỏ nó trước khi so sánh LIKE.

SQL fiddle:http://sqlfiddle.com/#!2/492906/7

+1

Tôi đã chỉnh sửa câu hỏi ... Chỉ cần thêm đây là truy vấn có thể tạo ra kết quả phù hợp, tôi đã sử dụng RLIKE: SELECT *, CASE WHEN LEFT (title_name, 1) RLIKE '[0-9]' THEN "# "ELSE LEFT (title_name, 1) END là title_char TỪ tiêu đề ORDER BY title_name – bimspramirez

+0

[Tài liệu bạn trích dẫn] (http://dev.mysql.com/doc/refman/5.5/en/pattern-matching.html) là về 'RLIKE', không phải' LIKE', vì vậy điều đó có vẻ đúng với tôi. Trong các phương ngữ SQL khác, '[...]' được chấp nhận bởi 'LIKE', nhưng (dường như) không có trong MySQL. – hvd

+0

Hi hvd, cảm ơn! – bimspramirez

Trả lời

5

The documentation là một chút bối rối. Tôi hy vọng snipping cẩn thận có thể làm cho nó rõ ràng hơn:

MySQL cung cấp mô hình tiêu chuẩn SQL phù hợp cũng như một hình thức phù hợp với mô hình

[...]

SQL khớp mẫu cho phép bạn sử dụng “ _ ”để khớp với bất kỳ ký tự đơn lẻ nào và“ % ”để khớp với số lượng ký tự tùy ý (bao gồm cả 0 ký tự). Trong MySQL, các mẫu SQL không phân biệt dạng chữ theo mặc định. Một số ví dụ được hiển thị ở đây. Bạn không sử dụng = hoặc <> khi bạn sử dụng các mẫu SQL; thay vào đó, hãy sử dụng các toán tử so sánh LIKE hoặc NOT LIKE.

[...]

Loại kết hợp mẫu khác do MySQL cung cấp sử dụng biểu thức chính quy mở rộng. Khi bạn kiểm tra kết quả phù hợp cho loại mẫu này, hãy sử dụng các toán tử REGEXPNOT REGEXP (hoặc RLIKENOT RLIKE, là từ đồng nghĩa).

[...]

Một lớp nhân vật “[...]” phù hợp với bất kỳ ký tự nằm trong dấu ngoặc đơn. Ví dụ: “[abc]” khớp với “a”, “b” hoặc “c”. Để đặt tên cho một dải ký tự, hãy sử dụng dấu gạch ngang. “[a-z]” khớp với bất kỳ chữ cái nào, trong khi “[0-9]” khớp với bất kỳ chữ số nào.

Vì câu cuối cùng nằm trong "loại kết hợp mẫu khác", nó chỉ áp dụng cho số RLIKE mà bạn đã tìm thấy, không phải là LIKE.

+1

Xin chào cảm ơn hvd! Tôi bị bối rối. Có lẽ vì tôi đã tìm thấy một bài đăng ở đây trong Stack Overflow đề xuất LIKE [0-9] để kiểm tra xem một ký tự có phải là một chữ số vì vậy tôi nghĩ rằng nó sẽ hoạt động. Cảm ơn, mọi thứ đã rõ ràng rồi! Xin lỗi SO nếu câu hỏi của tôi rất đơn giản và ngớ ngẩn, hãy cho tôi biết nếu câu hỏi đó bị xóa. Nhưng dù sao đi nữa, cảm ơn lần nữa tôi học được rất nhiều từ đây! – bimspramirez

+1

Mọi thứ đơn giản và ngớ ngẩn một khi bạn biết tại sao. :) Đừng lo lắng về nó, đó là một câu hỏi hoàn hảo. – hvd

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