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
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
[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
Hi hvd, cảm ơn! – bimspramirez