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

5 cách trả về hàng có chứa chữ thường trong SQL Server

Nếu bạn cần tìm các hàng có chứa chữ thường trong SQL Server, bạn có thể thử một trong các tùy chọn sau.

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ữ thường.

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

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

SELECT * FROM t1
WHERE UPPER(c1) COLLATE Latin1_General_CS_AS <> c1;

Kết quả:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

Bằng cách sử dụng không bằng (<> ) toán tử (bạn có thể sử dụng != thay vì <> nếu bạn thích), chúng tôi chỉ trả về những hàng khác với chữ hoa 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ữ hoa tương đương của nó, thì nó đã là chữ hoa để bắt đầu (và chúng tôi không muốn trả lại nó).

Chúng tôi cũng sử dụng COLLATE Latin1_General_CS_AS để chỉ định rõ ràng đối chiếu phân biệt chữ hoa chữ thường (và phân biệt trọng âm). Nếu không có điều này, bạn có thể nhận được kết quả không mong muốn, tùy thuộc vào đối chiếu đang được sử dụng trên hệ thống của bạn.

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

Ngoài ra, chúng ta có thể sử dụng LIKE và chỉ định các ký tự viết thường thực tế mà chúng tôi muốn đối sánh:

SELECT * FROM t1
WHERE c1 LIKE '%[abcdefghijklmnopqrstuvwxyz]%'
COLLATE Latin1_General_CS_AS;

Kết quả:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

Trong trường hợp này, ít hàng được trả về hơn trong ví dụ trước. Điều này là do tôi không chỉ định các ký tự như éø , được trả về trong ví dụ trước. Mặc dù một hàng có chứa é , hàng đó chỉ được trả về vì nó cũng chứa các ký tự viết thường khác khớp.

Do đó, ví dụ này hạn chế hơn ví dụ trước, nhưng nó cung cấp cho bạn nhiều quyền kiểm soát hơn đối với các ký tự bạn muốn đối sánh.

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

Ngoài ra, chúng tôi có thể chỉ định phạm vi ký tự mà chúng tôi muốn đối sánh:

SELECT * FROM t1
WHERE c1 LIKE '%[a-z]%'
COLLATE Latin1_General_100_BIN2;

Kết quả:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

Trong trường hợp này, tôi đã sử dụng đối chiếu nhị phân (Latin1_General_100_BIN2 ). Tôi đã làm điều này vì đối chiếu nhị phân sắp xếp từng trường hợp riêng biệt (như thế này:AB....YZ...ab...yz ).

Các ảnh ghép khác có xu hướng xen kẽ giữa chữ hoa và chữ thường (như thế này:AaBb...YyZz ), do đó sẽ khớp với cả ký tự viết hoa và viết thường.

Tùy chọn 4:Tìm Bản sao đầu tiên của một ký tự viết thường

Một cách khác để làm điều đó là sử dụng PATINDEX() chức năng:

SELECT * FROM t1
WHERE PATINDEX('%[abcdefghijklmnopqrstuvwxyz]%', c1
COLLATE Latin1_General_CS_AS) > 0;

Kết quả:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

Trong ví dụ này, chúng tôi chỉ định các ký tự chính xác mà chúng tôi muốn đối sánh và do đó, trong trường hợp này, chúng tôi không nhận được các hàng có các ký tự như éø (ngoại trừ cái cũng chứa các ký tự khác đã khớp).

Một lợi ích của kỹ thuật này là chúng ta có thể sử dụng nó để bỏ qua ký tự đầu tiên (hoặc số ký tự được chỉ định) nếu chúng ta muốn:

SELECT * FROM t1
WHERE PATINDEX('%[abcdefghijklmnopqrstuvwxyz]%', c1
COLLATE Latin1_General_CS_AS) > 1;

Kết quả:

+----------------+
| c1             |
|----------------|
| Café           |
| 1café          |
| James Bond 007 |
+----------------+

Do đó, chúng ta có thể trả về tất cả các hàng có chứa ký tự viết thường, nhưng trong đó ký tự đầu tiên không phải là ký tự thường.

Điều này là do PATINDEX() trả về vị trí bắt đầu của lần xuất hiện đầu tiên của mẫu (trong trường hợp của chúng ta, mẫu là danh sách các ký tự viết thường). Nếu vị trí bắt đầu của lần xuất hiện đầu tiên lớn hơn 1, thì ký tự đầu tiên không có trong danh sách các ký tự viết thường của chúng tôi.

Mặc dù kỹ thuật này có thể được sử dụng để bỏ qua ký tự đầu tiên là chữ hoa, nhưng không loại trừ rằng ký tự đầu tiên có thể là một ký tự khác, chẳng hạn như một số. Chúng ta có thể thấy điều này trong hàng thứ hai, chứa 1café .

Tùy chọn 5:Tìm phiên bản đầu tiên dựa trên phạm vi

Chúng tôi cũng có thể sử dụng PATINDEX() với một phạm vi:

SELECT * FROM t1
WHERE PATINDEX('%[a-z]%', c1
COLLATE Latin1_General_100_BIN2) > 1;

Kết quả:

+----------------+
| c1             |
|----------------|
| Café           |
| 1café          |
| James Bond 007 |
+----------------+

Tôi lại sử dụng đối chiếu nhị phân (giống như với ví dụ về phạm vi khác).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để so sánh 2 hàng từ cùng một bảng (SQL Server)?

  2. Cách tăng tốc máy chủ SQL của bạn bằng cách sử dụng giám sát hiệu suất cơ sở dữ liệu

  3. 4 Mẹo để Thiết lập Cảnh báo Máy chủ SQL của Bạn

  4. Lợi ích của việc sử dụng SET XACT_ABORT ON trong một quy trình được lưu trữ là gì?

  5. Những cột nào thường tạo ra các chỉ mục tốt?