Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

3 cách để tìm hàng có chứa chữ hoa trong MySQL

Dưới đây là ba tùy chọn để trả về các hàng có chứa các ký tự viết hoa trong MySQL.

Dữ liệu mẫu

Giả sử chúng ta có một bảng với dữ liệu sau:

SELECT c1 FROM t1;

Kết quả:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| JB 007         |
| 007            |
| NULL           |
|                |
| É              |
| É 123          |
| é              |
| é 123          |
| ø              |
| Ø              |
+----------------+

Chúng ta có thể sử dụng các phương pháp sau để trả về các hàng có chứa chữ hoa.

Tùy chọn 1:So sánh với LOWER() Chuỗi

Chúng ta có thể sử dụng LOWER() hàm để so sánh giá trị ban đầu với chữ thường tương đương của nó:

SELECT c1 FROM t1
WHERE CAST(LOWER(c1) AS BINARY) <> CAST(c1 AS BINARY);

Kết quả:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
| É              |
| É 123          |
| Ø              |
+----------------+

Bằng cách sử dụng không bằng (<> ) toán tử (bạn có thể sử dụng != một cách khác thay vì <> nếu bạn thích), chúng tôi chỉ trả về những hàng khác với chữ thường tương đương của chúng. Lý do chúng tôi làm điều này là bởi vì, nếu một giá trị giống với chữ thường tương đương của nó, thì nó đã là chữ thường khi bắt đầu (và chúng tôi không muốn trả lại nó).

Theo mặc định, MySQL thực hiện tìm kiếm không phân biệt chữ hoa chữ thường và vì vậy tôi sử dụng CAST() hàm truyền các giá trị sang hệ nhị phân để nhận được tìm kiếm phân biệt chữ hoa chữ thường.

Cũng có thể sử dụng BINARY toán tử để truyền giá trị sang nhị phân, nhưng toán tử này không được chấp nhận kể từ MySQL 8.0.27 và nó có thể bị xóa trong bản phát hành trong tương lai.

Trong mọi trường hợp, đây là mã trông như thế nào khi sử dụng BINARY nhà điều hành:

SELECT c1 FROM t1
WHERE BINARY LOWER(c1) <> BINARY c1;

Nó cũng có thể được thực hiện như thế này:

SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);

Đây là kết quả tôi nhận được từ cả hai điều này khi chạy mã trong MySQL 8.0.27:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
| É              |
| É 123          |
| Ø              |
+----------------+
8 rows in set, 2 warnings (0.00 sec)

Và khi tôi hiển thị các cảnh báo:

SHOW WARNINGS;

Kết quả:

+---------+------+----------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                      |
+---------+------+----------------------------------------------------------------------------------------------+
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
+---------+------+----------------------------------------------------------------------------------------------+

Tùy chọn 2:So sánh với các ký tự thực tế

Một tùy chọn khác là sử dụng REGEXP toán tử với một mẫu biểu thức chính quy bao gồm rõ ràng từng ký tự viết hoa mà chúng tôi muốn đối sánh:

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' AS BINARY);

Kết quả:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+

Lần này ít hàng được trả về hơn trong các ví dụ trước. Đó là vì tôi không chỉ định các ký tự như ÉØ , đã được trả lại trong các ví dụ đó. Kết quả của chúng tôi có chứa É nhưng hàng đó chỉ được trả về vì nó cũng chứa các ký tự viết hoa khác do phù hợp.

Do đó, bạn cần đảm bảo rằng bạn đã bao gồm tất cả các ký tự hợp lệ nếu bạn sử dụng tùy chọn này.

Tùy chọn 3:So sánh với một loạt các ký tự

Một cách khác để làm điều đó là chỉ định phạm vi ký tự hoa mà chúng ta muốn khớp:

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[A-Z]' AS BINARY);

Kết quả:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. chuyển LIMIT dưới dạng tham số cho MySQL opensc

  2. Giới thiệu về các kiểu dữ liệu SQL

  3. Cách tìm hiệu quả các vị trí gần nhất gần một vị trí nhất định

  4. Nhiều câu lệnh chọn trong một truy vấn

  5. Cách chuyển đổi hàng thành cột động trong MySQL