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

Langage SQL Discussion :

[SQL] Max à partir d'un découpage d'une chaine


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Par défaut [SQL] Max à partir d'un découpage d'une chaine
    Bonjour,

    Je suis sous Oracle et je cherche à récupérer la valeur maximum d'une colonne dont les chaines sont constitués de la forme suivante : Ex plus précis :

    NOM_COL
    1;23;1;249;
    1;23;1;10;
    5;10;1;
    3;6;1010;3;

    La requête me ressortirai alors 1010

    Je continue mes recherches de mon côté mais si quelqun a une solution, je suis preneur

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Pourriez-vous nous présenter une ébauche de la requête que vous tentez de mettre au point.
    Cela sera plus facile pour vous aider à la faire évoluer.
    En précisant le SGBD que vous utilisez et sa version, les réponses proposées seront adaptées aux spécificités et limitations de celui-ci.
    Règles du forum Langage SQL à lire par tous

    Comme le nombre de valeurs dans la colonne est variable, il sera difficile de faire un code générique, à moins d'utiliser une requête récursive.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Par défaut
    Pour le sgbd : Oracle (message édité)

    Pour la requête, pour l'instant, je cherche simplement des fonctions qui pourraient m'être utile pour la construire car je n'ai jamais été confronté aux requêtes complexes en SQL (l'habitude d'avoir un langage de programmation derrière)

    edit : la chaine est bien de taille variable car elle décrit une arborescence. Le côté récursif va pas être du gateau :/

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    En récursif normalisé, ça donnerait ça (à tester) :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    WITH    tmp_recurs
        (   macolonne
        ,   separe
        ,   mavaleur
        ,   reste
        )
    AS  (   SELECT  macolonne
                ,   POSITION(';' IN macolonne)  AS separe
                ,   macolonne AS mavaleur
                ,   ''  AS reste
            FROM    matable
            WHERE   separe = 0
        UNION ALL
            SELECT  macolonne
                ,   POSITION(';' IN macolonne)  AS separe
                ,   SUBSTRING(macolonne FROM 1 FOR separe - 1)  AS mavaleur
                ,   SUBSTRING(macolonne FROM separe + 1)    AS reste    
            FROM    matable
            WHERE   separe > 0  
        UNION ALL
            SELECT  macolonne
                ,   POSITION(';' IN reste)  AS separe2
                ,   SUBSTRING(reste FROM 1 FOR separe2 - 1) AS mavaleur
                ,   SUBSTRING(reste FROM separe2 + 1)   AS reste2   
            FROM    tmp_recurs
            WHERE   separe2 > 0
                AND reste > ''  
        UNION ALL
            SELECT  macolonne
                ,   POSITION(';' IN reste)  AS separe2
                ,   reste AS mavaleur
                ,   ''  AS reste2   
            FROM    tmp_recurs
            WHERE   separe2 = 0
                AND reste > ''  
        )
    SELECT  macolonne
        ,   mavaleur
    FROM    tmp_recurs  AS res
    WHERE   EXISTS
            (   SELECT  0
                FROM    tmp_recurs  AS tmp
                WHERE   res.macolonne   = tmp.macolonne
                HAVING  res.mavaleur    = MAX(tmp.mavaleur)
            )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Tests réalisés sous Oracle 9i :
    Solution oracle, complètement hors norme SQL ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT
    MAX(TO_NUMBER(SUBSTR(NOMCOL,INSTR(';'||NOMCOL,';',1,LEVEL),INSTR(NOMCOL,';',1,LEVEL)-INSTR(';'||NOMCOL,';',1,LEVEL)))) ValMax
    FROM matable
    CONNECT BY LEVEL <= LENGTH(NOMCOL)-LENGTH(REPLACE(NOMCOL,';',''))

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Par défaut
    Citation Envoyé par chrifo Voir le message
    Tests réalisés sous Oracle 9i :
    Solution oracle, complètement hors norme SQL ... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT
    MAX(TO_NUMBER(SUBSTR(NOMCOL,INSTR(';'||NOMCOL,';',1,LEVEL),INSTR(NOMCOL,';',1,LEVEL)-INSTR(';'||NOMCOL,';',1,LEVEL)))) ValMax
    FROM matable
    CONNECT BY LEVEL <= LENGTH(NOMCOL)-LENGTH(REPLACE(NOMCOL,';',''))
    Dommage que je ne l'ai pas vu avant

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 4
    Par défaut
    Ton code "al1_24" me sort l'erreur ORA-32033
    http://www.error-code.org.uk/view.as...p=ORA&ec=32033

    Après quelques courtes recherches, l'action et le code erreur étant pas assez précis, et vu que c'était un résultat à usage unique, je me le suis fadouiller à la main en scrutant les données.

    Par contre, ça m'a permis de voir qu'on peut aller beaucoup plus loin que je ne le pensais en SQL
    J'ai encore de quoi pas mal apprendre là dedans

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

Discussions similaires

  1. SS 2K5 - Découpage d'une chaine
    Par SebastienM dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/07/2009, 16h48
  2. Découpage d'une chaine de caractere
    Par abbd dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/02/2009, 23h43
  3. Découpage d'une chaine de caractères
    Par fab3131 dans le forum MFC
    Réponses: 2
    Dernier message: 08/04/2006, 17h46
  4. Découpage d'une chaine
    Par krfa1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/10/2005, 13h33
  5. découpage d'une chaine de caractère
    Par lamojuli dans le forum ASP
    Réponses: 4
    Dernier message: 13/05/2004, 16h00

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