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

MS SQL Server Discussion :

Equivalent de split_part (PostgreSQL) [2008]


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 218
    Par défaut Equivalent de split_part (PostgreSQL)
    Bonjour

    La fonction SPLIT_PART qui existe sous PostGreSQL n existe pas sous SQL server 2008.
    L un d'entre vous sait-il si il y a un equivalent de cette fonction sous SQLServer?

    J ai un fait une chaine de caractere formee ainsi chaine1.chaine6.chaine5.chaine2.chaine1

    LA longueur des chaines est aleatoire mais j'ai besoin de recuperer cette entre les 2eme et 2eme ".' . Dans cet exemple, il s'agit de chaine6.

    Une idee?

    Merci.

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Hello,

    Une solution parmi plusieurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    declare @chaine varchar(100) = 'chaine1.chaine6.chaine5.chaine2.chaine1';
     
    select 
    	cast('<c>' + REPLACE(@chaine, '.', '</c><c>') + '</c>' as xml).value('(/c/text())[2]', 'varchar(100)')
    Il faudra certainement rendre cette requête dynamique si la sous-chaîne que tu recherches n'est pas toujours à la même position

    ++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 218
    Par défaut
    Merci beaucoup.
    Ca marche c'est excellent.
    Mais juste pour ma culture, est-ce que tu peux m'expliquer ce que fait le code? Enparticulier l'aspect xml

    Merci encore.

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    L'idée ici est de transformer la chaîne de caractère suivante en XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'chaine1.chaine6.chaine5.chaine2.chaine1'
    qui deviendra :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '<c>chaine1</c><c>chaine6</c><c>chaine5</c><c>chaine2</c><c>chaine1</c>'
    Une fois la chaîne de caractère transformée il suffit d'appliquer les méthodes xquery utilisables avec ce type de données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value('(/c/text())[2]', 'varchar(100)')
    Dans notre cas la méthode value() dans laquelle on demande de récupérer le 2ème élément <c>valeur</c>

    On aurait pu également passer par une méthode plus "traditionnelle" à base de fonctions comme SUBSTRING() et CHARINDEX() mais dans ce cas je préfère personnellement la méthode à base de XML car elle permet de récupérer plus facilement la sous-chaîne en fonction de sa position comme le ferait SPLIT_PART() avec Postgresql. En espérant avoir répondu à ta question.

    ++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 218
    Par défaut
    Ca repond et ton explication est lumineuse.
    J'ignorais que l'on pouvait transformer des chaines en XML.
    C'est une DECOUVERTE pour moi... Merci Encore.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 : 21 999
    Billets dans le blog
    6
    Par défaut
    Plus classique (et souvent plus rapide sur des gros volumes), utilisez une fonction de splittage telle que celle que j'ai écrit :
    http://blog.developpez.com/sqlpro/p7...esure_multiple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @chaine varchar(100) = 'chaine1.chaine6.chaine5.chaine2.chaine1';
     
    SELECT MOT
    FROM dbo.F_MULTIPARSE(@chaine, '.')
    WHERE POS = 2;
    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/ * * * * *

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

Discussions similaires

  1. [PostgreSQL] [PostGreSQL] Equivalent de mysql_insert_id
    Par mic79 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/06/2007, 19h16
  2. equivalent autoincrement=0 avec postgresql?
    Par bali1234 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 26/03/2007, 21h42
  3. [Kylix] PostgreSql via ODBC
    Par doykati dans le forum EDI
    Réponses: 3
    Dernier message: 08/02/2007, 10h10
  4. spool equivalent postgresql
    Par car dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 17/05/2004, 09h22
  5. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    Réponses: 7
    Dernier message: 14/08/2002, 11h55

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