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 :

Extraire des chaines de caractère avec position dynamique


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut Extraire des chaines de caractère avec position dynamique
    Bonsoir,
    Je veux faire des extractions de chaine mais je sais pas comment le faire malgré la connaissance des fonctions de chaine en transact sql.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @Chaine varchar(500)
    SET @Chaine = 'CN=Alphonse De Charette,OU=Service Commercial,OU=Flexmind Paris,OU=FLEXMIND Ltd,DC=thalia,DC=fr'
    De cette chaine, je veux pouvoir analyser et recupérer les chaines en couleur verte dans des variables. Les chaines en verte ne sont pas connues (LEFT, Lenght, etc.)
    Les chaines en couleur rouge ne changeront dans le temps.

    merci de vos propositions pour gérer cela.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pouvez passer par une CTE récursive.

    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
     
    ;WITH CTE AS (
    	SELECT 
    		LEFT(@Chaine, CHARINDEX('=',@Chaine) - 1 ) AS Clef,
    		SUBSTRING(@Chaine, CHARINDEX('=',@Chaine) + 1, CHARINDEX(',', @Chaine) - CHARINDEX('=',@Chaine) - 1) AS Valeur,
    		CAST(RIGHT(@Chaine, LEN(@Chaine) - CHARINDEX(',', @Chaine) + CHARINDEX('=',@Chaine) - 3) + ',' AS VARCHAR(500))  AS Reste
    	UNION ALL
    	SELECT
    		LEFT(Reste, CHARINDEX('=',Reste) - 1 ),
    		SUBSTRING(Reste, CHARINDEX('=',Reste) + 1, CHARINDEX(',', Reste) - CHARINDEX('=',Reste) - 1) ,
    		RIGHT(Reste, LEN(Reste) - CHARINDEX(',', Reste) + CHARINDEX('=',Reste) - 3)
    	FROM CTE
    	WHERE LEN(Reste)> 0
     
    )
    SELECT Clef, Valeur
    FROM CTE
    Mais il serait sans doute préférable de faire une fonction CLR pour ce type de besoin...

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut
    Thanks aieeeuuuuu pour ta réponse.
    Mais voila comment j'ai fait pour résoudre mon problème juste avant de lire ta proposition:
    NB: J'ai dit que les chaines en rouge sont fixes et ce n'est que les chaines en vert qui peuvent changer
    Mon code qui marche:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    DECLARE @Chaine varchar(200), @Partie1 varchar(200), @Partie2 varchar(200), @Partie3 varchar(200), @Partie4 varchar(200), @Partie5 varchar(200), @Partie6 varchar(200);
    DECLARE @Longueur1 int, @Longueur2 int,  @Longueur3 int,  @Longueur4 int,  @Longueur5 int,  @Longueur6 int;
    
    SET @Chaine = 'CN=Alphonse De Charette,OU=Service Commercial,OU=Flexmind Paris,OU=FLEXMIND Ltd,DC=thalia,DC=fr';
    
    SET @Longueur1 = CHARINDEX(',OU', @Chaine);
    SELECT @Longueur1;
    SET @Partie1 = SUBSTRING(@Chaine,4,@Longueur1-4);
    SELECT @Partie1;
    
    SET @Longueur2 = CHARINDEX(',OU',@Chaine, @Longueur1+1);
    SELECT @Longueur2;
    SET @Partie2 = SUBSTRING(@Chaine,@Longueur1+4,@Longueur2-@Longueur1-4);
    SELECT @Partie2;
    
    SET @Longueur3 = CHARINDEX(',OU',@Chaine, @Longueur2+1);
    SELECT @Longueur3;
    SET @Partie3 = SUBSTRING(@Chaine,@Longueur2+4,@Longueur3-@Longueur2-4);
    SELECT @Partie3;
    
    SET @Longueur4 = CHARINDEX(',DC', @Chaine);
    SELECT @Longueur4;
    SET @Partie4 = SUBSTRING(@Chaine,@Longueur3+4,@Longueur4-@Longueur3-4);
    SELECT @Partie4;
    
    SET @Longueur5 = CHARINDEX(',DC', @Chaine, @Longueur4+1);
    SELECT @Longueur5;
    SET @Partie5 = SUBSTRING(@Chaine,@Longueur4+4,@Longueur5-@Longueur4-4);
    SELECT @Partie5;
    
    SET @Partie6 = SUBSTRING(@Chaine,@Longueur5+4,3);
    SELECT @Partie6;
    Ce petit bout de code; fait mon travail mais le hic, c'est la dernière chaine récupérer. J'arrive bien à me positionner à l'emplacement avec (@Longueur5 + 4) mais je ne peux connaitre la longueur de la chaine pour lire avec exactitude. Ici, j'ai mis 3 (en rouge).
    Question: Existe t-il une fonction T-SQL permettant de lire comme CHARINDEX mais plutôt de la droite vers la gauche??

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SOPSOU Voir le message
    Question: Existe t-il une fonction T-SQL permettant de lire comme CHARINDEX mais plutôt de la droite vers la gauche??
    Utilise la fonction REVERSE !

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Vous n'en n'avez pas besoins : vous prenez le "reste" de la chaine, vous avez un point depart, la fin, est donc la longueur de la chaine moins le point de départ (plus un)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @Partie6 = SUBSTRING(@Chaine,@Longueur5+4,len(@Chaine) - @Longueur5 - 3);
    Voire même, spécifier la longueur de la chaine ou une longueur arbitraire supérieure :
    Citation Envoyé par MSDN
    If the sum of start and length is greater than the number of characters in expression, the whole value expression beginning at start is returned.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @Partie6 = SUBSTRING(@Chaine,@Longueur5+4,len(@Chaine));

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 111
    Points
    111
    Par défaut
    Cool donc.

    Thanks.

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

Discussions similaires

  1. [DATA] Extraire des chaines de caractères
    Par étudiant11 dans le forum SAS Base
    Réponses: 4
    Dernier message: 02/03/2015, 12h03
  2. [XL-2007] Comparer des chaines de caractères avec like
    Par s.rais dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/01/2015, 20h22
  3. Extraire des chaines de caractères dans un fichier
    Par cycy75 dans le forum Scripts/Batch
    Réponses: 16
    Dernier message: 27/03/2009, 14h56
  4. Problème dans des "IF" avec des chaines de caractères
    Par lanysteph dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2006, 11h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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