Bonjour
Est-il possible en SQL de faire un where d'une colonne contenant (ou pas) un substring d'une autre colonne avec la sytaxe contains ?
Je ne comprends pas tres bien l'usage du contains car je peux le faire avec un like
Merci de votre aide
Version imprimable
Bonjour
Est-il possible en SQL de faire un where d'une colonne contenant (ou pas) un substring d'une autre colonne avec la sytaxe contains ?
Je ne comprends pas tres bien l'usage du contains car je peux le faire avec un like
Merci de votre aide
CONTAINS ne fait pas partie des mots réservés du langage SQL !
Si le LIKE répond à ton besoin, utilises-le !
Merci CINEPHIL
Et peux tu dire dans quel contexte Contains qui semble présent en MS SQL serait pertinent ?
Ça permet beaucoup plus d'options qu'un simple LIKE, on est plus dans la recherche textuelle que dans la comparaison d'une colonne à une valeur.
La doc Microsoft est assez complète sur ce sujet :
http://msdn.microsoft.com/fr-fr/library/ms187787.aspx
Merci Waldar
Mais a la lecture (rapide) de cette doc je n'ai toujours pas clairement compris ce que CONTAINS peut faire qu'on ne peut pas faire avec un LIKE
Et en cherchant sur Google je ne suis manifestement pas le seul a me poser cette question
J'utilise donc toujours un Like qui satisfait pleinement le besoin
Avec un LIKE, la recherche porte sur la chaîne de caractère exacte :
Pourra donner comme résultat :Code:
1
2
3 SELECT les_colonnes FROM la_table WHERE une_colonne LIKE '%part%'
- Particulier
- Appartement
- Départ
D'après la doc, CONTAINS comporte un argument qui précise la nature de la recherche. On pourra ne retenir avec CONTAINS que les mots dont le préfixe est 'part' et éliminer de la liste ci-dessus les deux derniers mots.
OK, ça peut aussi se faire avec un LIKE 'part%' ! Mais il y a d'autres options au CONTAINS non réalisables avec un LIKE.
Ceci dit, ce n'est pas du SQL Standard, si j'en crois la liste de mots dont j'ai donné le lien dans un autre message plus haut.
Le prédicat CONTAINS fait partie intégrante de la norme SQL dans son extensions FULL TEXT.
Cepandant il faut préalablement metre en place l'indexation textuelle.
Voici quelques exemples de CONTAINS :
--> 2.1 - Prédicat CONTAINS (norme SQL)
-- un mot
-- une expressionCode:
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"aile"')
-- un mot commençant par...Code:
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"Saint Martin"')
-- un mot près d'un autre...Code:
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"defaillan*"')
-- deux mots, l'un OU l'autreCode:
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"transpondeur" NEAR "panne"')
-- deux mots, l'un ET l'autreCode:
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"inverseur" OR "transpondeur"')
-- un mot, sans l'autreCode:
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"transpondeur" AND "radio"')
-- un mot "décliné" sous ses différentes formes fléchiesCode:
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"transpondeur" AND NOT "radio"')
-- (conjugaison, pluriel, féminin...) :
Code:
1
2
3
4
5
6 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, 'FORMSOF (INFLECTIONAL, "heurter")', LANGUAGE 'french') --> aboutiera à rechercher les formes fléchies du verbe heurter comme : -- heurte, heurté, heurta, heurtaient, heurterons... -- ATTENTION : vous devez préciser la langue pour les formes fléchies
-- un mot et ses synonymes
-- des combinaisons des différents éléments vus ci avantCode:
1
2
3
4 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, 'FORMSOF (THESAURUS , "moteur")', LANGUAGE 'french') --> aboutiera à rechercher les mots "réacteur" et "propulseur"
A +Code:
1
2
3
4
5
6
7
8 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '(FORMSOF (INFLECTIONAL, "heurter") OR "transpondeur") AND NOT "facade*"' , LANGUAGE 'french') --> trouvera les textes contenant une forme fléchie du mot "heurter" -- ou bien le mot "transpondeur", mais dont aucun mot du texte ne commence -- par "facade..."
Puissant comme fonction !
Fred, il faut que tu complètes ta liste de mots alors !
Merci pour ces réponse et a SqlPro pour tous ces détails !
Mais une question me vient a l'esprit :
Est ce que la mise en place de cette indexation n'allourdit pas fort les performance et le volume de la base ?Citation:
Envoyé par SqlPro
Parce que sauf certains cas précis mentionné dans la liste de SQL Pro, je dirais que +/- 80% peut etre fait avec un Like sans ajouter cette couche Full Text
Lorsque vous créer un index FULL TEXT vous pouvez paramétrer le type de mise à jour de l'index en automatique ou de manière aynchrone avec un système de planification (option CHANGE_TRACKING). Vous pouvez également dédié un FILEGROUP pour ce type d'index. D'autres optimisations sont également possibles ...Citation:
Est ce que la mise en place de cette indexation n'allourdit pas fort les performance et le volume de la base ?
La recherche FULL TEXT va au délà de ce que l'on peut réaliser avec LIKE :Citation:
Parce que sauf certains cas précis mentionné dans la liste de SQL Pro, je dirais que +/- 80% peut etre fait avec un Like sans ajouter cette couche Full Text
- Recherche de synonymes
- Recherche grammaticale
- Recherche à l'intérieur de documents
- Recherche avec notion de poids des mots et classement par rang etc ...
Si le but est de simplement rechercher un motif dans une chaîne il est certain que la recherche FULL TEXT n'a aucun intérêt.
++
Attention le LIKE est extrêmement couteux et peut mettre à genou un serveur. De même pour le REGEX (encore pire).
En revanche une bonne indexation textuelle peut s'avérer payante en terme de performances (lissage de charge).
Regardez ce que donne ceci sur AdventureWorks :
A +Code:
1
2
3 SELECT * FROM Sales.SalesOrderDetail WHERE rowguid LIKE '%_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[! z]@$!_%'
Merci SqlPro
Bon a savoir !
Finalement ce sujet est très instructif.