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

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

  2. #2
    Membre expérimenté
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    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 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.

    C'est quoi le "DDL" ?

  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 : 44
    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,

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

  6. #6
    Membre expérimenté
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    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.

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