IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

where item1 contains item2


Sujet :

Développement SQL Server

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut where item1 contains item2
    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)

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 !

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    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)

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ç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

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    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)

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Avec un LIKE, la recherche porte sur la chaîne de caractère exacte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT les_colonnes
    FROM la_table
    WHERE une_colonne LIKE '%part%'
    Pourra donner comme résultat :
    - 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 !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   dbo.T_CRASH_CRH
    WHERE  CONTAINS(CRH_RECIT, '"aile"')
    -- 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, '"Saint Martin"')
    -- 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, '"defaillan*"')
    -- 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, '"transpondeur" NEAR "panne"')
    -- 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, '"inverseur" OR "transpondeur"')
    -- 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, '"transpondeur" AND "radio"')
    -- 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 NOT "radio"')
    -- un mot "décliné" sous ses différentes formes fléchies
    -- (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
    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"
    -- des combinaisons des différents éléments vus ci avant
    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..."
    A +
    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/ * * * * *

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 !

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci pour ces réponse et a SqlPro pour tous ces détails !

    Mais une question me vient a l'esprit :
    Citation Envoyé par SqlPro
    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
    Est ce que la mise en place de cette indexation n'allourdit pas fort les performance et le volume de la base ?
    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)

  10. #10
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Est ce que la mise en place de cette indexation n'allourdit pas fort les performance et le volume de la base ?
    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 ...

    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
    La recherche FULL TEXT va au délà de ce que l'on peut réaliser avec LIKE :

    - 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.

    ++

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   Sales.SalesOrderDetail
    WHERE  rowguid LIKE '%_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[! z]@$!_%'
    A +
    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/ * * * * *

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    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)

Discussions similaires

  1. [PROC] WHERE CONTAINS + prompt
    Par thtghgh dans le forum SAS Base
    Réponses: 0
    Dernier message: 12/12/2013, 15h33
  2. problème de Contains dans une clause where
    Par niko59480 dans le forum Accès aux données
    Réponses: 1
    Dernier message: 13/12/2012, 14h02
  3. quelqu'un connait-il le where contains ?
    Par blastfr dans le forum SAS Base
    Réponses: 2
    Dernier message: 04/07/2008, 00h23
  4. Clause WHERE contains()
    Par Rocou dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 25/10/2007, 18h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo