2010-11-18 3 views
7

Utilisation PATINDEX et une collation sensible à la casse pour rechercher des lettres majuscules dans une chaîne que j'ai remarqué cela n'a pas été pour donner le résultat souhaité:Range comportement correspondant modèle générique avec les classements sensibles à la casse

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

cependant, spécifier chaque lettre, AZ, fait:

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

Ma compréhension de l'utilisation d'une plage dans le premier cas est-elle incorrecte? Pourquoi le comportement est-il comme ça?

+0

Merci pour cela, je avais besoin d'extraire les lignes commençant par les lettres majuscules seulement: PATINDEX ('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%', [NOM] COLLATE SQL_Latin1_General_CP1_CS_AS) = 1 –

Répondre

6

Malheureusement, les opérateurs de gamme sont un peu drôles. La gamme de lettres de A-Z est:

AbBcCdDeE...yYzZ 

C'est, les caractères minuscules précèdent immédiatement son homologue supérieur de cas. C'est aussi amusant parce que si vous voulez traiter les caractères majuscules et minuscules, dans un classement sensible à la casse, la plage A-Z exclut les minuscules a. Je devrais dire ce qui précède, en ce qui concerne la façon dont la gamme se développe, est basé sur les collations que je travaille généralement avec. Comment la gamme se développe réellement est collation dependent. Si vous pouvez trouver un classement où, par exemple, tous les caractères majuscules se produisent avant tous les caractères minuscules, alors la plage fonctionnerait comme prévu. (? Peut-être l'un des classements binaires)

+1

spot sur @Damien_The_Believer ! Passer à Latin1_General_100_BIN2 donne le même résultat, 3, pour les deux extraits dans ma question ci-dessus .. merci pour la clarification –

Questions connexes