2013-02-26 57 views
26

Tôi đang cố gắng tìm các bản ghi chứa một chuỗi gồm 6 ký tự chữ và số bằng chữ hoa. Một số ví dụ:Làm cách nào để thực hiện tìm kiếm phân biệt chữ hoa chữ thường bằng cách sử dụng LIKE?

PENDING 3RDPARTY CODE27 

Tôi đang sử dụng các tuyên bố sau:

SELECT Details 
FROM MyTable 
WHERE Details LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%'; 

này được trả lại tất cả hồ sơ có chứa bất kỳ từ 6-or-nhiều chữ, không phân biệt trường hợp.

Tôi đã thêm một tuyên bố COLLATE:

SELECT Details 
FROM MyTable 
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%'; 

này thay đổi gì cả. Nó vẫn trả về các bản ghi có từ 6 chữ cái trở lên, bất chấp trường hợp nào.

Cũng giống như một thử nghiệm, tôi đã cố gắng:

SELECT Details 
FROM MyTable 
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%pending%'; 

SELECT Details 
FROM MyTable 
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%PENDING%'; 

Cả hai làm việc, trở về hồ sơ có chứa "chờ" và "CHƯA" tương ứng. Vì vậy, vấn đề dường như là do sự phù hợp với mẫu của một số trang của LIKE.

Tôi có thể làm gì để thực hiện tìm kiếm phân biệt chữ hoa chữ thường này?

+6

thử sử dụng COLLATE Latin1_General_BIN –

+0

Hoàn hảo! Bạn muốn làm cho câu trả lời đó? –

+1

Tại sao? Để có được một vài điểm. Tôi chỉ thích sự hài lòng khi biết rằng tôi đã giúp. –

Trả lời

36

Hãy thử sử dụng COLLATE Latin1_General_BIN hơn COLLATE Latin1_General_CS_AS

26

Cập nhật do @GeraldSv: Sử dụng chiếu Latin1_General_BIN

SELECT Details 
FROM MyTable 
WHERE Details 
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%' 
COLLATE Latin1_General_BIN; 

Bạn cần phải đặt collation specifier sau chuỗi để được xuất hiện chứ không phải là cột:

SELECT Details 
FROM MyTable 
WHERE Details 
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%' 
COLLATE Latin1_General_CS_AS; 

Cập nhật : Trong khi câu trả lời của tôi ở trên là chính xác, có một lỗi được gửi tại Connect: Case-SENSITIVITY doesn't work when using a range in like with COLLATE Latin1_General_CS_AS mà Microsoft đã đánh dấu là 'Theo Thiết kế'.

Tôi xác minh bằng cách sử dụng AdventureWorks2008R2 (trường hợp không nhạy cảm, trong hộp mặc định), trong bảng Person.Person tôi đã thay đổi 3 tên cuối cùng kết thúc bằng 'n' thành 'N' và sau đó chạy các truy vấn sau:

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%N' COLLATE Latin1_General_CS_AS 

Thành công. Trả lại 3 hàng như mong đợi.

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[N]' COLLATE Latin1_General_CS_AS 

Thành công. Trả lại 3 hàng như mong đợi.

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[N-N]' COLLATE Latin1_General_CS_AS 

Thành công. Trả lại 3 hàng như mong đợi.

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_CS_AS 

Không.Returns 3334 Rows (đó là kết thúc tất cả của LastName trong 'n' và 'N')

Cập nhật: Nhờ @GeraldSv, công trình này:

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_BIN 
+0

Cảm ơn tất cả các nghiên cứu! –

0

tôi sử dụng các mục sau:

SELECT COUNT(*) 
FROM Person.Person 
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS 
Các vấn đề liên quan