Поведение при сопоставлении шаблонов шаблонов с учетом регистра

Используя PATINDEX и регистр с учетом регистра для поиска заглавных букв в строке, я заметил, что это не дает желаемого результата:

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

однако, указав каждую букву, AZ, делает:

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

Мое понимание использования диапазона в первом случае неверно? Почему такое поведение?

1 ответ

Решение

К сожалению, операторы диапазона немного забавны. Диапазон букв от AZ:

AbBcCdDeE...yYzZ

То есть символы нижнего регистра непосредственно предшествуют аналогу верхнего регистра. Это также забавно, потому что если вы хотите иметь дело как с заглавными, так и строчными буквами, в сопоставлении с учетом регистра диапазон AZ исключает строчные буквы a.


Я должен сказать, что выше, относительно того, как расширяется диапазон, основано на сопоставлениях, с которыми я обычно работаю. То, как диапазон фактически расширяется, зависит от параметров сортировки. Если вы можете найти параметры сортировки, где, например, все символы в верхнем регистре располагаются перед всеми символами в нижнем регистре, тогда диапазон будет работать так, как вы ожидаете. (Возможно одно из двоичных сопоставлений?)

Другие вопросы по тегам