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 :

récupérer nième dernier mot avec sql


Sujet :

Langage SQL

  1. #1
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut récupérer nième dernier mot avec sql
    Hello les gens,
    Je cherche à recupérer le nième dernier mot (comprenez délimité par des espaces) sur un champs d'une table.
    Un exemple pour clarifier tout cela:

    La requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select distinct fim.OTHRLONGNAME, substr(fim.OTHRLONGNAME, length(fim.OTHRLONGNAME)-2, 3) as COL1, substr(fim.OTHRLONGNAME, length(fim.OTHRLONGNAME)-7, 8) as COL2
    from TABLE fim
    where ...
    Ramène ce qui suit:

    Le champs|COL1|COL2
    BDT du 04/07/2010 3,55% à 52 semaines|nes|semaines
    BDT du 17/01/2006 3,95% à 5 ans|ans|à 5 ans

    Mon besoin est de récupérer sur la ligne 1 les mots "52" et "semaines", et sur la ligne 2 les mots "5" et "ans"

    En somme j'aurais besoin de quelque chose qui ressemble à un StringTokenizer java.
    Merci pour toutes vos contributions.

  2. #2
    Membre actif Avatar de sofiane_bfm007
    Profil pro
    Consultant Décisionnel
    Inscrit en
    Mai 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Décisionnel

    Informations forums :
    Inscription : Mai 2008
    Messages : 261
    Points : 242
    Points
    242
    Par défaut
    Bonsoir,
    Si la partie en rouge est tjr la même (ne change pas selon les lignes d'enregistrement) "BDT du 14/07/2010 3,55% à 52 semaines" alors tu peux faire un truc comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT fim.OTHRLONGNAME, substr(fim.OTHRLONGNAME, 26, 2) AS COL1, Trim(substr(fim.OTHRLONGNAME, 28, 9)) AS COL2
    FROM TABLE fim
    WHERE ...
    Bon courage
    Business Intelligence : Talend, Cognos 8, SAS 9.2, ODI

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Quel est le SGBD utilisé ?
    Les fonctions de texte peuvent varier d'un SGBD à l'autre.

    Chercher le dernier mot d'une phrase revient à chercher les derniers caractères de cette phrase ( tenir compte éventuellement de la ponctuation finale, ce qui ne semble pas le cas pour vous), à partir de la position du dernier espace.

    En MySQL, on peut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT RIGHT('la phrase', POSITION(' ' IN REVERSE('la phrase')) - 1)
    => 'phrase'

    Pour trouver l'avant dernier mot, il suffit de tronquer la phrase de son dernier mot et de son dernier espace puis de faire la même opération.
    J'ai donné le principe, je vous laisse chercher pour votre SGBD.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Pour soufiane:
    Merci d'avoir répondu. Après malheureusement pour
    Si la partie en rouge est tjr la même (ne change pas selon les lignes d'enregistrement) "BDT du 14/07/2010 3,55% à 52 semaines"
    eh beh ça n'est pas le cas.
    Pour CinePhil:
    Merci pour ta réponse.
    Quel est le SGBD utilisé ?
    Très bonne question, je comptais aborder ça dans un second temps. C'est sur du DB2 LUW la requête tournera sur un report en jasper/ireport [strike]d'où une impossibilité à priori d'utiliser de l'SQL PL[/strike].

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 091
    Points : 28 362
    Points
    28 362
    Par défaut
    Connais-tu la liste de tes derniers mots et les valeurs possibles des valeurs numériques qui les précèdent ?
    Si ton nombre ne dépasse pas 2 chiffres, tu devrais t'en sortir avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH lst AS
    (   SELECT  ' ans'   AS mot
        FROM    DUAL
    UNION
        SELECT  ' semaines'
        FROM    DUAL
    )
    SELECT  TRIM(SUBSTRING(tbl.pharse FROM CHAR_LENGTH(TRIM(tbl.phrase)) - CHAR_LENGTH(lst.mot) - 2 FOR 2)) AS valnum    
    FROM    matable AS tbl
        INNER JOIN
            lst
            ON  SUBSTRING(tbl.phrase FROM CHAR_LENGTH(TRIM(tbl.phrase)) - CHAR_LENGTH(lst.mot) + 1) = lst.mot
    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.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    AHMA, il faut le faire avec du récursif

    Voici un exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE TAB1(
    	CLEUNIK INT, 
    	LIBELLE VARCHAR (50) )                         
     
     
    INSERT INTO TAB1
    VALUES	(1111, 'BDT du 04/07/2010 3,55% à 52 semaines'),
    	(2222, 'BDT du 17/01/2006 3,95% à 5 ans')
    En faisant cette requête


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with t1 (cle, nbr, mot, w)                       
       as (Select cleunik, 0, '', Libelle from tab1  
    union all                                        
        Select cle, nbr+1,                           
           substr(w, 1, posstr(w, ' ') -1),          
           ltrim(substr(w, posstr(w, ' ') + 1, 50))  
        from t1                                      
           Where trim(w) <> ''                  )    
    select * from t1
    On obtient :

    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
     
      CLE             NBR   MOT        !   W                                      
    1.111               0              !   BDT du 04/07/2010 3,55% à 52 semaines  
    2.222               0              !   BDT du 17/01/2006 3,95% à 5 ans        
    1.111               1   BDT        !   du 04/07/2010 3,55% à 52 semaines      
    2.222               1   BDT        !   du 17/01/2006 3,95% à 5 ans            
    1.111               2   du         !   04/07/2010 3,55% à 52 semaines         
    2.222               2   du         !   17/01/2006 3,95% à 5 ans               
    1.111               3   04/07/2010 !   3,55% à 52 semaines                    
    2.222               3   17/01/2006 !   3,95% à 5 ans                          
    1.111               4   3,55%      !   à 52 semaines                          
    2.222               4   3,95%      !   à 5 ans                                
    1.111               5   à          !   52 semaines                            
    2.222               5   à          !   5 ans                                  
    1.111               6   52         !   semaines                               
    2.222               6   5          !   ans                                    
    1.111               7   semaines   !                                          
    2.222               7   ans        !

    Maintenant si tu veux récupérer à chaque fois les deux derniers mots (et ce quelque soit le nombre de mots ) il suffira de faire :

    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
     
     
    with t1 (cle, nbr, mot, w)                       
       as (Select cleunik, 0, '', Libelle from tab1  
    union all                                        
        Select cle, nbr+1,                           
           substr(w, 1, posstr(w, ' ') -1),          
           ltrim(substr(w, posstr(w, ' ') + 1, 50))  
        from t1                                      
           Where trim(w) <> ''                  ),   
        t2 as (Select cle, max(nbr) dern from t1     
                  Group by cle)                      
    select t1.cle, mot from t1, t2                   
     Where t1.cle = t2.cle                           
      and  t1.nbr in (t2.dern, t2.dern -1)           
      order by 1, nbr
    afin d'avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      CLE   MOT      
    1.111   52       
    1.111   semaines 
    2.222   5        
    2.222   ans

  7. #7
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    désolé pour ce retard et merci bcp à tous, K2R400 en particulier.

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

Discussions similaires

  1. Comment récupérer le dernier enregistrement avec MYSQLI ?
    Par Alexandrebox dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/04/2009, 18h29
  2. Réponses: 5
    Dernier message: 24/06/2008, 13h07
  3. Réponses: 1
    Dernier message: 27/12/2006, 20h04
  4. [VB]récupérer le dernier chemin ouvert avec commondialog
    Par bhaal76 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 14/02/2006, 16h50
  5. Récupérer les identifiants de la DB avec SQL.
    Par Cygnus Saint dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/08/2005, 07h15

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