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 :

Découpage et comparaison de chaine


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut Découpage et comparaison de chaine
    Bonjour à tous

    J'ai un truc un peu balaise à faire dans une requête et je ne sais pas du tout par où chercher une solution. Du coup je suis même ennuyé pour fournir un jeu d'enregistrement.

    Le principe est le suivant : j'ai une table qui contient des données dont un champ appelé Keyword. Ce champ contient des chaines. Ces chaines sont composées de mot séparés par des virgules.
    En paramettre j'envoi une chaine composée aussi de mot séparés par des virgules.

    Je doit comparer chaque mot de la chaine avec chaque mot des chaines de chaque enregistrement dans le champ Keyword et retourner chaque enregistrement qui contient au moins un des mots de la liste en paramettre.

    Pour l'instant j'ai pris le parti de passer par une fonction et j'ai construit ma requête comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DECLARE @keywordsearch VARCHAR(200)
    SET @keywordsearch = 'moto'
     
    SELECT dbo.motcle(Keyword,@keywordsearch) AS Occu,* FROM dbo.Gig
    WHERE dbo.motcle(Keyword,@keywordsearch) > 0
    Et la fonction ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ALTER FUNCTION dbo.motcle
    (
    	@keyword VARCHAR(200), @keywordsearch VARCHAR(200)
    )
    RETURNS INT
    AS
    BEGIN
    DECLARE @Occurence INT
    IF @keyword = @keywordsearch
     
    SET @Occurence = 1
    ELSE
    SET @Occurence = 0
     
    	RETURN @Occurence
     
    END
    Donc à chaque fois qu'il y a le mot 'moto' dans le champ Keyword cela me retourn 1, donc l'enregistrement. Mais le mot 'moto' est parfois accompagné d'autres mot et là, ça ne sort pas.

    Voilà mon souci, je ne sais pas dans quelle direction chercher pour découper les chaines et les comparer.

    Pouvez vous m'aider ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    bonjour

    Je vous conseillerais plutôt de vous tourner vers la recherche texte intégrale (fulltext search), si ce n'est pas trop tard ....

    Sinon, vous pouvez toujours essayer avec la fonction patindex. Exemple si dans le champ Keyword vous avez :

    moto;bagnole;traste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @keywordsearch VARCHAR(200)
    SET @keywordsearch = '%moto%'
     
    select patindex(@keywordsearch ,Keyword) from dbo.Gig
    devrait retourner qqch > 1 si moto apparait dans le champ. Vérifiez la syntaxe je n'ai pas testé...

  3. #3
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci pour ton aide

    Alors il n'est jamais trop tard, sauf que le fulltext search, je ne connais pas du tout. ça commence par où ? Un tuto peut-être ou une explication basique me serait bien utile.

    Ensuite, sur la fonction j'ai avancé dans cette direction et j'en suis là maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ALTER FUNCTION dbo.motcle
    (
    	@keyword VARCHAR(200), @keywordsearch VARCHAR(200)
    )
    RETURNS INT
    AS
    BEGIN
    DECLARE @Occurence INT
    IF @keyword LIKE '%' + @keywordsearch + '%'
     
    SET @Occurence = 1
    ELSE
    SET @Occurence = 0
     
    	RETURN @Occurence
     
    END
    L'ennui est sur l'envoi d'une chaine de @keywordsearch avec plusieurs mots. Je vois pas comment la découper et rechercher chaque mot.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Je te suggère fortement d’utiliser une fonction « Split » telle que décrite ci-dessous.
    Cette fonction te permettra non seulement de décomposer une liste de chaines séparées par une virgule (ou tout autre caractère séparateur), mais aussi de retourner le résultat sous fourme de table ce qui te permettra d’effectuer des opérations SQL ensembliste comme des jointures ou pour ton cas je pense notamment à l’intersection (INTERSECT) de 2 ensembles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    CREATE FUNCTION dbo.FC_U_SPLIT( 
       @pi_List VARCHAR(8000),           
       @pi_Delimiter VARCHAR(8000) = ',' 
       )
       RETURNS @List TABLE (Item VARCHAR(8000))
       BEGIN
        DECLARE @sItem VARCHAR(8000)
    	WHILE CHARINDEX(@pi_Delimiter,@pi_List,0) <> 0 
    	BEGIN 
    	   SET @sItem = RTRIM(LTRIM(SUBSTRING(@pi_List,1,CHARINDEX(@pi_Delimiter,@pi_List,0)-1)));  
    	   SET @pi_List = RTRIM(LTRIM(SUBSTRING(@pi_List,CHARINDEX(@pi_Delimiter,@pi_List,0)+LEN(@pi_Delimiter),LEN(@pi_List)))); 
    	   IF LEN(@sItem) > 0  
    	      INSERT INTO @List (Item) VALUES (@sItem);   
    	END; 
    	IF LEN(@pi_List) > 0 
    	   INSERT INTO @List (Item) VALUES (@pi_List);  
    	RETURN; 
    END
    GO
    Exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * from dbo.FC_U_SPLIT('Moto, Bicyclette, Voiture', ',') 
    Résultat : 
    Moto
    Bicyclette
    Voiture

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    La manipulation de chaînes de caractères n'étant pas le fort de SQL Server, je vous conseille, comme Kagemaru, d'utiliser la fonctionnalité de recherche de texte intégral.

    Un bon tutoriel sur le sujet est celui de Ditch.

    Si vous voulez aller encore plus loin avec la recherche en texte intégral, je vous suggère la lecture de Pro Full-Text Search in SQL Server 2008.

    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Découpage dynamique d'une chaine de caractère
    Par zut94 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/10/2005, 18h49
  2. [langage] Comparaison de chaîne
    Par Fastshadow dans le forum Langage
    Réponses: 7
    Dernier message: 05/09/2004, 18h58
  3. comparaison de chaines de caracteres en PLSQL
    Par biozaxx dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/08/2004, 09h41
  4. Comparaison de chaines
    Par Marc_P dans le forum Linux
    Réponses: 6
    Dernier message: 17/02/2004, 17h04
  5. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41

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