2010-11-18 29 views
7

Sử dụng PATINDEX và một collation trường hợp nhạy cảm để tìm kiếm chữ hoa chữ cái trong một chuỗi Tôi nhận thấy điều này đã không được năng suất kết quả mong muốn:Phạm vi mẫu ký tự đại diện phù hợp với hành vi với trường hợp nhạy cảm collations

-- returns 1 
SELECT PATINDEX('%[A-Z]%' 
        , 'abCde' COLLATE SQL_Latin1_General_Cp1_CS_AS); 

tuy nhiên, chỉ định mọi chữ cái, AZ, có:

-- returns 3 
SELECT PATINDEX('%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%' 
        , 'abCde' COLLATE SQL_Latin1_General_Cp1_CS_AS); 

Hiểu biết của tôi về việc sử dụng một phạm vi trong trường hợp đầu tiên không đúng? Tại sao hành vi như thế này?

+0

Cảm ơn cho điều này, tôi cần phải giải nén hàng bắt đầu với chữ viết hoa chỉ chữ: PATINDEX ('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%', [TÊN] đối chiếu SQL_Latin1_General_Cp1_CS_AS) = 1 –

Trả lời

6

Thật không may, các nhà khai thác dải ô là một chút buồn cười. Phạm vi của các chữ cái từ A-Z là:

AbBcCdDeE...yYzZ 

Tức là, ký tự chữ thường ngay trước chữ hoa trên. Điều này cũng thú vị vì nếu bạn muốn đối phó với cả chữ hoa và chữ thường, trong trường hợp đối chiếu nhạy cảm, phạm vi A-Z loại trừ trường hợp thấp hơn a.


Tôi nên nói ở trên, về cách dải ô mở rộng, dựa trên các đối chiếu mà tôi thường làm việc. Phạm vi thực sự mở rộng là collation dependent. Nếu, bạn có thể tìm thấy một đối chiếu, ví dụ, tất cả các ký tự chữ thường xuất hiện trước tất cả các ký tự chữ thường, sau đó phạm vi sẽ hoạt động như bạn mong đợi. (? Có lẽ một trong những collations nhị phân)

+1

giao ngay trên @Damien_The_Believer ! Chuyển sang Latin1_General_100_BIN2 mang lại kết quả tương tự, 3, cho cả hai đoạn trích trong câu hỏi của tôi ở trên .. cảm ơn cho việc làm rõ –

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