2010-10-14 11 views
7

je dois sélectionner tous les enregistrements où:Comment écrire une instruction SQL pour utiliser "LIKE" pour neuf valeurs différentes?

where FIELD2 like '%value21%' 
or FIELD2 like '%value22%' 
or FIELD2 like '%value23%' 
-- repeat up to 
or FIELD2 like '%value29%' 

Ici, value21, ..., value29 sont des paramètres que l'utilisateur peut mettre en forme avant de soumettre la requête. Ce sont des codes numériques (non consécutifs) et FIELD2 est une colonne de base de données contenant une valeur de chaîne.

Quelle est la forme la plus compacte pour écrire ma requête SQL?

Remarque: Ceci est lié à an earlier question, mais cela nécessite LIKE plutôt que d'être égal à.

+1

Cela nous aiderait énormément si vous nous dire ce que 'value21..value29' est – Sathya

+1

Et: quelle base de données? – Arjan

+0

@Arjan, vous avez raison: j'ai mis à jour ma question. Il est trop difficile pour moi maintenant d'expliquer la structure de la base de données. Avez-vous une question spécifique? –

Répondre

16

Je crains que vous êtes coincé avec:

WHERE (FIELD2 LIKE '%value21' OR 
     FIELD2 LIKE '%value22' OR 
     FIELD2 LIKE '%value23' ...) 

au moins dans la norme SQL (votre moteur particulier pourrait offrir une certaine forme d'indexation en texte intégral qui aiderait).

Une requête comme celle-ci indique souvent un problème de normalisation dans la conception de votre base de données avec plusieurs valeurs stockées dans une seule valeur de champ. Si c'est vrai dans votre cas et que vous avez un quelconque contrôle sur le schéma de la base de données, je vous conseille de corriger le problème le plus rapidement possible. Sinon, vérifiez votre couverture médicale pour vous assurer qu'elle couvre la psychose induite par le langage SQL - cela peut vous rendre fou.

+4

+1 pour "Je conseille de réparer le problème le plus rapidement possible". Bon conseil – NotMe

+0

Euh, y a-t-il des problèmes que vous ne recommanderiez pas de réparer? – Robus

+2

@Robus: où la solution est plus coûteuse que le problème persistant. –

1

Une façon:

select Field1, Field2 from Table where Field2 like '%val%' 
UNION 
select Field1, Field2 from Table where Field2 like '%val2%' 
UNION 
select Field1, Field2 from Table where Field2 like '%val2%' 

etc.

+0

Pas UNION ALL, je pense, car certaines lignes peuvent correspondre à plusieurs conditions différentes. Je pense à un UNION "régulier" tant que le PK est inclus dans la liste des champs sélectionnés. –

+0

@Larry: ajusté en conséquence. Merci – NotMe