2010-11-18 5 views
7

Uso PATINDEX e un confronto case-sensitive per cercare le lettere maiuscole in una stringa Ho notato che questo non ottiene il risultato desiderato:Gamma comportamento carattere jolly corrispondenza con regole di confronto-sensitive

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

tuttavia, specificando ogni lettera, AZ, fa:

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

è la mia comprensione di utilizzare una gamma nel primo caso non corretto? Perché il comportamento è così?

+0

grazie per questo, avevo bisogno di estrarre le righe che iniziano con solo lettere maiuscole: PATINDEX ('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]%', [NAME] FASCICOLA SQL_Latin1_General_Cp1_CS_AS) = 1 –

risposta

6

Sfortunatamente, gli operatori della gamma sono un po 'divertenti. La gamma di lettere da A-Z è:

AbBcCdDeE...yYzZ 

Cioè, minuscole precedono immediatamente il loro caso omologo superiore. Questo è anche divertente perché se si desidera trattare con caratteri maiuscoli e minuscoli, in una fascicolazione sensibile al maiuscolo/minuscolo, l'intervallo A-Z esclude la lettera minuscola a.


dovrei dire quanto sopra, per quanto riguarda come la gamma si espande fuori, si basa su regole di confronto Io in genere con cui lavoro. Come l'intervallo effettivamente si espande è collation dependent. Se è possibile trovare una collazione in cui, ad esempio, tutti i caratteri maiuscoli si verificano prima di tutti i caratteri minuscoli, l'intervallo funzionerebbe come previsto. (? Forse una delle regole di confronto binarie)

+1

Spot on @Damien_The_Believer ! Passando a Latin1_General_100_BIN2 si ottiene lo stesso risultato, 3, per entrambi gli snippet nella mia domanda sopra .. grazie per il chiarimento –