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 :

Comparer deux chaines de liste


Sujet :

Développement SQL Server

  1. #1
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut Comparer deux chaines de liste
    Bonjour

    Je suis confronté à un souci dont je ne trouve pas la solution.
    Je dois comparer deux chaines de liste pour trouver des équivalences.

    J'ai une chaine comme cela : '1,2,3' et dans la base j'ai un champ VARCHAR qui contient des chaine du même genre.
    Je dois trouver tous les enregistrements qui ont au moins un des membres de la chaine de critère. Par exemple si un enregistrement contient '1,4,5' il doit sortir.

    J'ai essayé de repartir d'un solution analogue qu'on ma gentillement donné dans un autre topic, mais je maitrise pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHARINDEX(RTRIM(CONVERT(CHAR,IM.Valeur_Info)),@Critere)>0
    où @Critere est la chaine de critère et IM.Valeur_Info est le champ contenant la chaine recherchée. Sauf que dans ce cas là, la valeur est unique.

    Pouvez vous m'aider ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    Bonjour,
    Oui je me souviens de votre problème.
    Mais cette fois ci est il possible d'avoir le DDL de vos tables? En effet si vous rencontrez ce type de problème j'ai peur que vos données ne soient pas normalisés.

  3. #3
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide.

    C'est quoi le "DDL" ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    DDL = Data Description Language, c'est à dire les requêtes qui permettent de créer des objets de bases de données (tables, procédures, fonctions, vues, ...)

    DML = Data Modification Language = commande INSERT / UPDATE / DELETE

    DCL = Data Control Language = GRANT / REVOKE / DENY

    ...

    @++

  5. #5
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Ok, merci Elusket.

    Donc le DDL de mes tables n'auras aucun interêt pour résoudre ce problème.
    Je comrpends mieux l'histoire de nomalisation maintenant. Donc non, mes données en sont pas normalisées mais je ne peux pas les normaliser tel que j'ai fait mon application. J'ai besoins d'une grande souplesse et je n'ai pas trouver d'autre moyen que de dénormaliser une partie de mon modèle.

    Du coup, je stocke sous forme de liste de nombre les données issues d'une CheckBoxList en gardant les valeurs cochées (valeurs qui ont une correpondance dans une autre table pour savoir de quoi on parle).
    Dans un autre formulaire, j'offre la possibilité de chocher des cases de cette CheckBoxList et ensuite il faut que je trouve tous les membres qui ont coché au moins une des cases que l'utilisateur courant à coché dans le formulaire de recherche.

    Pour réduire j'ai une liste tel que : '1,2,'3' et que je cherche tous ceux qui ont ou 1 ou 2 ou 3 dans leur liste.

    Est ce que mon exposé est plus clair comme ça ?

    Pour conclure sur la normalisation de mon modèle de donnée : le normaliser maintenant n'est pas impossible, je vais juste metre 1 an et demi de travail à la poubelle et perdre l'élasticité que j'avais sur le conception de mes formulaires. A quelque jours de la mise en ligne de mon premier site, ça serait ballot, je trouve.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  6. #6
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    Bien compris, dans ce cas je vous propose de créer une fonction qui retourne 0 si aucun critère ne correspond et différent de 0 sinon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    create function trouve (@test1 nvarchar(50), @test2 nvarchar(50)) returns int as
    begin
    	declare @position int;
    	declare @trouve int;
    	set @trouve=0;
    	set @position=1
    	while (@position<=datalength(rtrim(@test2)) AND @trouve=0)
    	begin
    		set @trouve=charindex(substring(@test2,@position,1),@test1)
    		set @position=@position+2;	-- pour sauter la virgule
    	end
    	return @trouve
    end
    Je l'ai testé de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare @test1 nvarchar(50)
    declare @test2 nvarchar(50)
    set @test1='1,2,3'
    set @test2='1,4,5'
     
    select dbo.trouve(@test1, @test2);
    Les résultats semblent conformes à votre demande.

  7. #7
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Citation Envoyé par zooffy
    J'ai besoins d'une grande souplesse et je n'ai pas trouver d'autre moyen que de dénormaliser une partie de mon modèle
    Sûr ça ?

    @++

  8. #8
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci jero44, le temps de finir mon café et je teste ça. ça m'a l'air un peu plus compliqué que ce que j'ai fait jusque là, mais je pense m'en sortir. Parce quel'idée c'est de récupérer les idnetifiant de chaque member du site pour les quels ça ne ser apas 0.


    Oui, elsuket, c'est tout à fait sûr. Je vais essayer de te présenter l'ampleur du projet, mais ça pas être simple en quelques phrases.

    Min site, ou plutôt système de iste, fonctionne su une seule et unique page. Donc j'ai une Default.aspx qui va chercher des information dans la BDD en fonction de l'URL quelle reçoit. A aprtir de l à elle sait sur quel site est est et quelle sont les modules qui la compose. Jusque là, j'ai tout normalisé selon Merise (d'où aussi l'utilisation de UniqueIdentifier pour les utilisateurs et les rôle de sécurité).
    Un des modules sert à fabriquer des formulaires et à stocker et restituer des informations à partir de ces formulaires. J'ai donc nue table qui contient des informations sur les champs de formulaire, regroupées par un nom de formulaire. Ces info vont servir à déterminer sir le champ est un TExtBOx, une DropDownList ou CheckBoxLsit ou autre. Une table intermédiaire va déterminer (par l'idetifiant de la descirption du champ) le match entre deux champ de deux formulaires, où le type de champ peut différent. Les description va ausi conenir le libélle du champ, l'éventuel message d'erreur à la saisie si elle est formatée, son caractère obligatoire, bref pas mal de chose.

    Ensuite le champs de saisie peut donc avoir un type différent du champ de recherche. Pra exemple pour renseigner la couleur des yeux (dans un cas de site de rencontre) on va faire appel à une DropDownList et pour chercher on va faire appelle à une CheckBoxList. D'où la table intermédiaire de matching qui va déterminer quel champ va sur quel champ et ainsi exclure les champ sur lesquels on ne peut pas faire de recherche.

    Enfin, le stockage des informations du membre se fait de manière verticale dans une table qui contient : l'identifiant du membre, l'identifaint de l'information (venant de la table de description du champ) pour savoir de quelle info on parle et la valeur stockée, valeur pouvant être brute (directement saisie) ou de référence : dans le cas d'un liste j'ai une autre table qui stocke des listes standard accessible à tous mes site (Civilité par exemple)

    Du coup, sur un site donnée mon utilisateur peut avoir 4 informations (Nom, Prénom, Adresse, Téléphone) et sur un autre il peut en avoir 25 (couleur des yeux, des cheveux, ....)

    Et vu que tout ça ne fonctionne que sur une seule page, voilà d'où je tire ma fameuse souplesse. De plus, ce système de site est voué à être ouvert à un public non technicien et fabriquer un formulaire revient à cocher des cases et remplir des zones de texte.

    Est ce que ça te donne une petite idée des soucis que je peut avoir et donc pourquoi j'ai besoins de chose bizarre pour extraire mes données ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  9. #9
    Membre extrêmement actif
    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 : 53
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Je viens de faire le premier test et j'ai des résultats qui ne correspondent pas.
    Mais vu que là on est dans un nieau de SQL qui je ne maitrise pas, ben je suis paumé.

    Donc j'ai fait un essai avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare @test1 nvarchar(50)
    declare @test2 nvarchar(50)
    SET @test1='1,2,3'
    SET @test2='4,5,45,89'
     
    SELECT dbo.trouve(@test1, @test2)
    Et là il me renvoi 2 alors que j'attends 0.

    Malgrés ça jai réussi à mettre la fonction dans la clause WHERE de ma requête et cela remonte de bons résultats tant qu'il n'y a pas de valeur dans la liste avec deux chiffres.
    J'ai essayé de comprendre le mécanisme, mais ça vol trop haut pour moi. Je suis pas assez à l'aise pour trouvé le souci.

    Merci pour ton aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  10. #10
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    Bonjour,
    effectivement la première version n'est valide quer pour des nombres définis sur 1 caractères. Voici donc une évolution de la fonction trouve:
    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
    20
    21
    22
     
    CREATE FUNCTION trouve (@test1 nvarchar(50), @test2 nvarchar(50)) returns int AS
    begin
    	declare @position int;
    	declare @Fin int; 
    	declare @extrait nvarchar(50)
    	declare @trouve int;
     
    	SET @trouve=0;
    	SET @position=1
    	SET @Fin=charindex(',',@test2)
     
    	while (@fin>0 AND @trouve=0)
    	begin
    		SET @Fin=charindex(',',@test2)
    		SET @extrait=substring(@test2,@position,@fin)
    		SET @trouve=charindex(@extrait,@test1)
     
    		SET @test2=substring(@test2,@fin+1,len(@test2))
    	end
    	RETURN @trouve
    end

Discussions similaires

  1. Comparer deux chaines
    Par gferrier dans le forum Langage
    Réponses: 1
    Dernier message: 21/03/2007, 15h43
  2. Comparer deux chaines
    Par ponpon17430 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/09/2006, 23h20
  3. Réponses: 4
    Dernier message: 08/09/2006, 09h41
  4. Comparer deux chaines de caractères dans un if ?
    Par Xplosif² dans le forum C++
    Réponses: 6
    Dernier message: 25/02/2006, 19h21
  5. comparer deux chaines de caractères
    Par peuf23 dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2006, 14h31

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