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 :

split un champ de ma table dans un select


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 217
    Par défaut split un champ de ma table dans un select
    Bonjour à tous,

    J'ai une table sql qui contient 2 champs :
    ID int
    ADRESSE varchar(MAX)

    le champ ADRESSE contient des adresses mails séparées par des ; (en nombre variable et de longueur variable)

    Je cherche désespérément à faire une requête qui m'extrait les adresses mails exploitables :

    exemple de contenu de ma table :
    1 toto@yahoo.fr;titi@gmail.fr;tata@yahoo.fr
    2 tutu@gmail.fr;toto@yahoo.fr
    ...

    résultat escompté :
    1 toto@yahoo.fr
    1 titi@gmail.fr
    1 tata@yahoo.fr
    2 tutu@gmail.fr
    2 toto@yahoo.fr

    j'ai bien trouvé sur le net un exemple de fonction qui split un champ mais je n'arrive à le faire fonctionner que sur une ligne de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare @des varchar(max) = (SELECT top 1 [ADRESSE] FROM matable)
         SELECT * FROM fctSplitToChar(@des, ';')
    la fonction :
    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
    ALTER FUNCTION [fctSplitToChar]( 
        @DelimitedText VARCHAR(MAX),  -- liste CSV
        @QuoteChar CHAR(1)            -- caractère de délimitation
    ) RETURNS @Items TABLE (Item VARCHAR(MAX))
     
    BEGIN
       DECLARE @Item VARCHAR(MAX)
       WHILE CHARINDEX(@QuoteChar, @DelimitedText, 0) <> 0 BEGIN
            SELECT @Item=SUBSTRING(@DelimitedText,1,CHARINDEX(@QuoteChar,@DelimitedText, 0)-1), 
                   @DelimitedText=SUBSTRING(@DelimitedText,CHARINDEX(@QuoteChar,@DelimitedText, 0) + LEN(@QuoteChar), LEN(@DelimitedText))
            IF LEN(RTRIM(@Item)) > 0
                INSERT INTO @Items SELECT CONVERT(VARCHAR, @Item)
       END
       -- Dernier item de la liste
       IF LEN(RTRIM(@DelimitedText)) > 0
           INSERT INTO @Items SELECT CONVERT(VARCHAR, @DelimitedText)
       RETURN
    END
    impossible de la faire fonctionner dans une requête sur l'ensemble des lignes de ma table, j'ai essayé la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.ID, b.Item
    FROM     matable a
    CROSS    APPLY fctSplitToChar(a.ADRESSE, ';') AS b
    mais ça me renvoie une erreur Syntaxe incorrecte vers '.'.

    Merci d'avance de vos réponses.

  2. #2

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 217
    Par défaut
    merci pour votre réponse mais cela parle d'une fonction de splittage utilisant une conversion en xml ... pourquoi pas. Mais cela ne réglera pas mon problème pour autant (à moins que je n'ai pas tout compris) : mon problème n'est pas tant de splitter une chaine de caractères (la fonction que j'utilise le fait très bien) mais de l’intégrer dans une requête select sur l'ensemble des lignes de ma table...

    notamment, pourquoi le cross appli ne fonctionne t il pas ? cela réglerait mon pb simplement sans tout réécrire.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Utilisez la fonction que j'ai écrit à ce sujet :
    http://blog.developpez.com/sqlpro/p7...esure_multiple

    Utilisez le lien PDF, car les balises de merde de developpez bouffent le code SQL....

    Le jeu d'essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE table_sql
    (ID int,
     ADRESSE varchar(MAX));
     
    INSERT INTO table_sql VALUES 
    (1, 'toto@yahoo.fr;titi@gmail.fr;tata@yahoo.fr'),
    (2, 'tutu@gmail.fr;toto@yahoo.fr');
    La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID, MOT
    FROM   table_sql
           CROSS APPLY dbo.F_MULTIPARSE(ADRESSE, ';')
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ID          MOT
    ----------- --------------------
    1           toto@yahoo.fr
    1           titi@gmail.fr
    1           tata@yahoo.fr
    2           tutu@gmail.fr
    2           toto@yahoo.fr
    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/ * * * * *

  5. #5
    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,

    Vous pouvez aussi vous aider de ce billet

    @++

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 217
    Par défaut
    Merci à tous pour vos réponses,

    Je vais essayer tout ça dés que possible.

Discussions similaires

  1. [MySQL] Trouver si une lettre existe dans le champ d'une table dans un SELECT
    Par pasc06 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 29/12/2008, 09h01
  2. Réponses: 14
    Dernier message: 19/10/2006, 14h23
  3. [VBA-A]Recuperation champ d'une table dans une collection
    Par Nizarazu dans le forum VBA Access
    Réponses: 14
    Dernier message: 06/04/2006, 11h24
  4. afficher les champs null de deux tables dans un select
    Par poil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/09/2005, 15h05
  5. Stocker un champs d'une table dans une variable
    Par ju360modena dans le forum ASP
    Réponses: 3
    Dernier message: 15/06/2005, 08h44

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