2012-08-07 6 views
1

Dans SQL Server, j'ai une colonne de chaîne qui contient des nombres. Chaque entrée dont j'ai besoin est un seul numéro, donc aucune analyse n'est nécessaire. J'ai besoin d'une certaine façon de trouver toutes les lignes qui contiennent des nombres de 400 à 450. Au lieu de faire:Comment comparer rapidement plusieurs chaînes?

...where my stringcolumn like '%400%' or stringcolumn like '%401%' or stringcolumn like '%402%' or ... 

est-il un meilleur qui peut sauver sur certains taper?

Il existe également d'autres valeurs dans ces lignes telles que: '5335154', [email protected] ',' 555-555-5555 '. Le filtrage de ceux-ci devra être pris en compte.

+1

À quoi ressemblent les chaînes? Voulez-vous faire correspondre 1401 ainsi que 401? Voulez-vous faire correspondre 14010? –

Répondre

3
...where stringcolumn like '4[0-4][0-9]' OR stringcolumn = '450' 

Vous n'avez pas besoin wildcard si vous voulez limiter à 3 chiffres.

+0

Je pense que c'est celui-là. Merci. – 4thSpace

2

Utilisez regex pour accomplir ceci.

...where stringcolumn like '4[0-4][0-9]' OR stringcolumn like '450' 
+0

Merci. Y a-t-il un moyen de le limiter à seulement 3 chiffres? Il reprend d'autres choses telles que '5335154', [email protected] ',' 555-555-5555 '. Aurait dû être plus clair à ce sujet dans la question. J'ai mis à jour la question. – 4thSpace

+0

Réponse mise à jour. –

0

une façon

WHERE Column like '%4[0-4][09]%' 
OR Column LIKE '%500%' 

garder à l'esprit que cela va prendre quoi que ce soit avec le chiffre, alors 5000 sera retourné aussi bien

0

je ferais ce qui suit:

select t.* 
from (select t.*, 
      (case when charindex('4', col) > 0 
        then substrint(col, charindex('4', col), charindex('4', col) + 2) 
       end) as col4xx 
     from t 
    ) t 
where (case when isnumeric(col4xx) = 1 
      then (case when cast(col4xx as int) between 400 and 450 then 'true' 
        end) 
     end) = 'true' 

Je ne suis pas fan d'avoir des déclarations de cas dans les clauses WHERE. Toutefois, pour assurer la conversion en nombre, cela est nécessaire (ou la conversion peut devenir une colonne dans une autre sous-requête). Notez que ce qui suit n'est pas équivalent:

where col4xx between '400' and '450' 

Puisque la chaîne '44A' correspond.

Questions connexes