2014-06-26 5 views
1

Je travaille dans SQL Server 2008. J'essaie de retourner tous les enregistrements où les colonnes données ont une sous-chaîne qui correspond à au moins un jeton d'une très grande taille ensemble de jetons. Le nombre de colonnes que je recherche est également assez important. Quelle est la meilleure façon de procéder?Recherche d'un grand nombre de jetons sur un grand nombre de colonnes

Je sais que l'approche de base est quelque chose comme:

WHERE 
    (col1 LIKE '%token1%' OR col1 LIKE '%token2%' OR... 
    OR 
    col2 LIKE '%token1%' OR col1 LIKE '%token2%' OR... 
    OR 
    . . . . 
    ) 

Cependant, ce sera très fastidieux et grande.

+0

Je me demande s'il serait utile d'ajouter toutes les colonnes ensemble et de chercher cette chaîne à la place de chaque colonne individuelle. – Beth

+0

Oui, je peux certainement concaténer les colonnes (avec un délimiteur séparant chacune). Mais, j'ai toujours le problème de la recherche de nombreux jetons. – user3100444

+0

pouvez-vous mettre tous vos jetons (STREET, DRIVE, AVENUE) dans une table, avec un jeton pour chaque rangée, puis parcourir les rangées pour trouver les allumettes? Vous ne savez pas exactement ce que vous faites, voulez-vous remplacer les jetons par une abréviation standard? – Beth

Répondre

2

Ceci est un peu long pour un commentaire.

Vous avez essentiellement deux alternatives. Le premier est la recherche en texte intégral. C'est-à-dire, traiter chaque colonne comme un document et créer un index de texte intégral sur eux.

La deuxième option consiste à normaliser votre structure de données. Vous devez créer une ligne distincte pour chaque jeton dans chaque colonne. Une ligne dans cette structure normalisée ressemblerait à:

EntityId  "Column"  Token 
    1   col1  Toke1 
    1   col3  Toke2 
    2   col1  Toke2 
. . . 

Cette structure accélérerait considérablement votre recherche avec l'index approprié. D'ailleurs, votre structure de données semble suspecte. Une table qui contient des listes de choses dans une colonne est généralement une mauvaise idée. La structure de données appropriée pour une liste dans les bases de données relationnelles est une table, pas une colonne. Une table avec plusieurs colonnes qui contiennent le même type d'information (comme une liste de jetons) suggère généralement que les colonnes doivent être dénormalisées.

+0

En fait, ma table contient des adresses de clients. Il est généralement normalisé dans le sens où les informations sur les rues sont toujours dans la colonne Rue, les valeurs des pays sont toujours dans la colonne Pays, etc. Cependant, il peut y avoir des enregistrements où les informations sur la rue sont dans la colonne Pays. Donc, je dois traiter chaque colonne comme si elle pouvait contenir n'importe quel élément de données (c'est pourquoi j'ai besoin de chercher dans toutes les colonnes). J'essaie de déterminer où certains jetons n'étaient pas abrégés. Par exemple, je dois déterminer où «STREET» a été utilisé au lieu de «ST». Il y a beaucoup de jetons que je dois rechercher. – user3100444

+0

@ utilisateur3100444. . .Il semble que vous ayez besoin de passer quelques jours à nettoyer les données. Avoir la "Rue" parfois dans la colonne "Pays" est dangereux. –

+0

Droite. Cependant, je ne contrôle pas ce qui est entré dans cette table. J'essaie simplement de déterminer où les mots complets ont été utilisés au lieu des abréviations. – user3100444