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
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
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
CONTAINS ne fait pas partie des mots réservés du langage SQL !
Si le LIKE répond à ton besoin, utilises-le !
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Merci CINEPHIL
Et peux tu dire dans quel contexte Contains qui semble présent en MS SQL serait pertinent ?
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
Ç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
Email : http://scr.im/waldar
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
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
Avec un LIKE, la recherche porte sur la chaîne de caractère exacte :
Pourra donner comme résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
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 expression
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"aile"')
-- un mot commençant par...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"Saint Martin"')
-- un mot près d'un autre...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"defaillan*"')
-- deux mots, l'un OU l'autre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"transpondeur" NEAR "panne"')
-- deux mots, l'un ET l'autre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"inverseur" OR "transpondeur"')
-- un mot, sans l'autre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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échies
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM dbo.T_CRASH_CRH WHERE CONTAINS(CRH_RECIT, '"transpondeur" AND NOT "radio"')
-- (conjugaison, pluriel, féminin...) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 avant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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..."
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
Puissant comme fonction !
Fred, il faut que tu complètes ta liste de mots alors !
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
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 ?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
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
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 ...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 :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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT * FROM Sales.SalesOrderDetail WHERE rowguid LIKE '%_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[! z]@$!_%'
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
Merci SqlPro
Bon a savoir !
Finalement ce sujet est très instructif.
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager