2010-05-27 3 views
2

J'ai une colonne qui est entier et je veux rechercher tous les numéros commençant par 1500.SQL Server Comme pour Integer

Je sais que je pourrais utiliser quelque chose comme left(accountid, 4)= 1500.

Mais est-ce une solution optimale ou existe-t-il une meilleure approche? J'utilise SQL Server 2005.

+2

Quel est le type de colonne? Vous dites que c'est un nombre entier mais vous impliquez en utilisant une fonction de chaîne. – mdma

+0

Et s'il s'agit d'un nombre entier, tous les nombres ont-ils la même longueur? par exemple. 1500123, 1500751 etc –

+0

@mdma - c'était mon point. La colonne est un entier mais je veux faire une chaîne comme opération dessus. @Martin smith - Non – Prashant

Répondre

2

En supposant que vous connaissez les valeurs minimales et maximales pour votre colonne, vous pouvez le faire:

select 
    stuff 
from 
    table 
where 
    (number = 1500) 
or (number >= 15000 and number <= 15009) 
or (number >= 150000 and number <= 150099) 
or (number >= 1500000 and number <= 1500999) 
or (number >= 15000000 and number <= 15009999) 
-- add however many statements you need. 

Ou si vous ne vous ne pouviez pas savoir les minimums et maximums, faites ceci:

... 
where 
    (number - 1500*POWER(10, FLOOR(LOG10(number) - 3))) 
    < (POWER(10, FLOOR(LOG10(number) - 3))) 
3
LEFT(CONVERT(varchar, accountid),4)="1500" 
+3

... mais ce ne sera pas forcément rapide. –

1

Si vous voulez aller encore plus loin, pourquoi ne pas créer comme une catégorie super pour les comptes et qui éliminerait la nécessité d'effectuer GAUCHE() sur un varchar converti à partir d'un nombre entier . Pour clarifier, si vous connaissez tous les comptes commençant par l'ID 1500 sont, disons, les comptes liés aux ventes, vous pourriez avoir une super catégorie de 1500 pour tous. Cela ne s'applique certainement que si cette relation hiérarchique existe =).

1

Tout dépend du volume de données. Si vous parlez de millions d'enregistrements, l'utilisation de left avec convert ne sera pas rapide. La meilleure option possible serait d'avoir une colonne calculée qui stocke les quatre premiers chiffres et vous feriez directement une recherche à partir de celle-ci serait la plus rapide. Mais chaque insertion ou mise à jour prendrait un peu plus de temps. Tout dépend du nombre de lignes que vous traitez.

HTH

3

INT est un INT est un INT - il est juste une valeur numérique. Un INT ne "ressemble" pas à une valeur de chaîne ..... si vous voulez comparer avec LIKE, vous avez besoin d'une chaîne - vous devez convertir votre INT en une chaîne pour pouvoir le faire.

Si vous avez besoin de rechercher et de comparer contre cette représentation de chaîne de votre INT beaucoup, je recommande ce qui en fait une calculée, persista colonne sur votre table:

ALTER TABLE dbo.YourTable 
    ADD IntString AS LEFT(CAST(YourInt AS VARCHAR(20)), 4) PERSISTED 

De cette façon, vous obtenez une nouvelle colonne qui a une valeur à l'intérieur, cette valeur est toujours à jour, c'est une colonne persistante, vous pouvez l'indexer si nécessaire - vous obtenez tous les avantages de comparer votre "int" avec l'opérateur LIKE :-)

3

Si vous êtes prêt à échanger de l'espace de stockage pour la vitesse de performance, je voudrais ajouter une colonne persistante, calculée à la table contenant la chaîne de rsion de l'entier, indexer de manière appropriée et utiliser cette colonne pour la recherche.

0
select columnname from dbo.TB 
     where CONVERT(varchar(20), columnname) like '15'+'%' 
Questions connexes