3 votes

La même condition LIKE appliquée à plusieurs colonnes

J'ai une requête SQL qui joint plusieurs tables et je veux filtrer les enregistrements en utilisant la même condition LIKE pour plusieurs colonnes du jeu de résultats. Par exemple, j'ai des colonnes t1.Name, t1.FullName, t1.Comment, t2.Name, t3.Description, etc. dans ma requête (t1, t2 et t3 sont les noms des tables jointes) et je veux vérifier si t1.Name ou t1.FullName ou t1.Comment ou t2.Name ou t3.Description est LIKE '%sometext%'. Je suis simplement intéressé par le SQL qui sera le plus rapide ?

WHERE t1.FullName LIKE '%sometext%' OR t1.Comment LIKE '%sometext%' OR
      t2.Name LIKE '%sometext%' OR t3.Description  LIKE '%sometext%'

ou

WHERE ISNULL(t1.Name,'') + '|' + ISNULL(t1.FullName,'') + '|' + ISNULL(t1.Comment,'') + '|' + ISNULL(t2.Name,'') + '|' + ISNULL(t3.Description,'') LIKE '%sometext%'

Ou peut-être existe-t-il un moyen encore plus rapide ? J'utilise MS SQL Server 2008 R2.

UPD : J'ai modifié ma deuxième requête pour gérer les situations où certains champs sont NULL et où la concaténation peut contenir un motif mais pas les champs séparément.

1voto

John Woo Points 132738

La meilleure façon de procéder est d'utiliser FULL-TEXT SEARCH .

en utilisant WHERE t1.FullName LIKE '%sometext%' par exemple, empêche le serveur d'utiliser l'index sur cette colonne.

1voto

RichardTheKiwi Points 58121

Je le garderais écrit comme ça :

WHERE t1.FullName LIKE '%sometext%' OR t1.Comment LIKE '%sometext%' OR
      t2.Name LIKE '%sometext%' OR t3.Description  LIKE '%sometext%'

Plusieurs raisons pour ne pas utiliser ce dernier, où plus rapide n'entre même pas en ligne de compte :

  1. Résumé des statistiques de la chaîne peut être utilisé pour servir la requête, et il peut combiner différents index sur différentes colonnes dans des circonstances exceptionnelles. Ceci n'est pas possible avec le texte concaténé
  2. t1.FullName + .... peut résulter en NULL - vous devez gérer cela
  3. t1.FullName + .... peut aboutir à ce que le texte soit trouvé entre t1.Comment et t2.Name, par ex.
    • t1.Comment Bienvenue dans le hub
    • t2.Nom = Blenheim
    • sometext = "hubble
    • ... t1.Commentaire + t2.Nom ... = ... hubBle nheim matches hubble

1voto

digscoop Points 231

Cela dépend de la taille et du nombre de colonnes et de la fréquence de la chaîne de recherche. Et probablement d'autres choses.

Notez que les deux requêtes no produisent les mêmes résultats. La requête de concaténation ne traite pas les valeurs NULL de la même manière que la première.

Imaginez également que le nom se termine par "%some" et que la description commence par "text%".

0voto

RustamIS Points 460

Je pense que la deuxième façon est meilleure :

WHERE t1.Name + t1.FullName + t1.Comment + t2.Name + t3.Description LIKE '%sometext%'

Cependant, les deux requêtes présentent des avantages et des inconvénients ; la requête n°1 peut fonctionner plus rapidement si ces champs contiennent des données très volumineuses (longues).

0voto

jainvikram444 Points 4237
"WHERE t1.FullName LIKE '%sometext%' OR t1.Comment LIKE '%sometext%' OR
      t2.Name LIKE '%sometext%' OR t3.Description  LIKE '%sometext%'"
or

"WHERE t1.Name + t1.FullName + t1.Comment + t2.Name + t3.Description LIKE '%sometext%'"

=============
Here Both are take same time bacause each condition is checked by separatly one by one.
No way to differnce in both condition.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X