2010-05-11 7 views
3

J'ai une table de numéros de téléphone, en stockant le numéro de téléphone comme varchar (20). J'ai l'obligation de mettre en œuvre la recherche des deux nombres entiers, mais aussi que la dernière partie du nombre, donc une requête typique sera:Index pour la correspondance générique de fin de chaîne

SELECT * FROM PhoneNumbers WHERE Number LIKE '%1234' 

Comment puis-je mettre un index sur la colonne Number pour faire les recherches efficaces? Est-il possible de créer un index qui trie les enregistrements sur la chaîne inversée? Une autre option pourrait consister à inverser les chiffres avant de les stocker, ce qui donnera des requêtes telles que:

SELECT * FROM PhoneNumbers WHERE ReverseNumber LIKE '4321%' 

Cependant qui exigera que tous les utilisateurs de la base de données pour inverser toujours la chaîne. Il pourrait être résolu en stockant à la fois le numéro normal et le numéro inversé et en mettant à jour le numéro inversé par un déclencheur lors de l'insertion/mise à jour. Mais ce genre de solution n'est pas très élégant.

D'autres suggestions?

+1

oeil à cette réponse: http://stackoverflow.com/questions/1537645/in-the-beginning-of-like-clause/1537706#1537706 –

Répondre

4
ALTER TABLE phonenumbers ADD reverse_number AS REVERSE(number) PERSISTED 

CREATE INDEX ix_phonenumbers_reversenumber ON phonenumbers (reverse_number) 

SELECT * 
FROM phonenumbers 
WHERE reverse_number LIKE '4321%' 
2

Vous n'avez pas besoin d'avoir les utilisateurs inverse à moins qu'ils exécutent manuellement la requête et vous pouvez utiliser une colonne calculée plutôt qu'un déclencheur:

CREATE TABLE TBL (TEL VARCHAR(20) NOT NULL) 
ALTER TABLE TBL ADD TEL_REV AS REVERSE(TEL) 
CREATE NONCLUSTERED INDEX IX_REVERSETEL ON TBL (TEL_REV) INCLUDE (TEL) 

INSERT TBL SELECT '12345678' 
    UNION SELECT '147258369' 
    UNION SELECT '963852741' 

--find nums ending in 5678 
SELECT * FROM TBL WHERE TEL_REV LIKE REVERSE('5678') + '%' /*index seek*/ 
Questions connexes