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

SQL Oracle Discussion :

Sélectionner les N premiers mots d'un champ texte


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Par défaut Sélectionner les N premiers mots d'un champ texte
    Bonjour tout le monde !

    Je cherche quelque chose de super simple : Retourner les N premiers mots d'un champ de texte.
    Dans ce cas, le séparateur serait ESPACE.

    Y'a pas une fonction pour ça ?

    Merci pour les réponses !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 67
    Par défaut
    Citation Envoyé par keskispas
    Bonjour tout le monde !

    Je cherche quelque chose de super simple : Retourner les N premiers mots d'un champ de texte.
    Dans ce cas, le séparateur serait ESPACE.

    Y'a pas une fonction pour ça ?

    Merci pour les réponses !
    Tu peux faire par exemple :
    select rpad('ABCDEFGKLM HTYU IO', instr('ABCDEFGKLM HTYU IO', ' ')) from dual

    INSTR() qui te donne la position de ton séparateur
    RPAD() qui te donne les X caractères à droite

    J'espère que cela va t'aider.

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with t as (select 'Ma plus belle requete en sql' t, 3 n from dual) 
    select t,n,substr(t,1,instr(t,' ',1,n)) s from t;
    T                                     N S
    ---------------------------- ---------- ----------------------------
    Ma plus belle requete en sql          3 Ma plus belle

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    pour les anciennes bases, il est possible de créer une fonction du style :

    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
    CREATE OR REPLACE function left_substr ( strTemp varchar2,delim varchar2, cpt number ) return varchar2 is
    pos      number(3):=1;
    cptCurr  number(2) := 0;
    oldpos number(3) := 1;
    begin
     while instr (strTemp,delim,oldpos )>0 loop
        pos := instr (strTemp,delim,oldpos) ;
        if pos > 0 then
           cptCurr := cptCurr +1;
           oldpos := pos +1 ;
           if cptCurr = cpt then
    	    oldpos := pos -1;
          	exit ;
           end if;
        else
            oldpos := pos +1;
        end if;
     end loop;
     if pos > 0 then
        return substr(strTemp,0,oldpos);
     else
        return strTemp ;
     end if;
    end;
    /
    1* select left_substr('Salut toto comment vas tu ?',' ',4) result from dual
    SQL> /

    RESULT
    -------------------------------------------------------------------------------
    Salut toto comment vas
    CDLT.

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    substr(t,1,instr(t,' ',1,n)) fonctionne sans aucun doute dans Oracle 4, tu veux dire quoi par ancienne base?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    WITH t AS ne fonctionne pas en 8.05 entre autres ,
    le monde n'est pas composé que de 10gR2 ....

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT texte, substr(texte,1,instr(texte,' ',1,3)) s 
    FROM MATABLE

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    le with n'a rien a voir avec la fonction...

    SELECT t,n,substr(t,1,instr(t,' ',1,n)) s FROM t;

    est la partie intéressante.

    Mais heureusement qu'il y a plus de monde en 10.2 qu'en 8.0.5, désupportée le siècle passé

    Ne pas oublier de spécifier la version
    http://www.developpez.net/forums/showthread.php?t=28716

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    ... mea culpa.

    Avec un nvl au cas où le N serait supérieur au nombre de mots afin renvoyer la chaine complète.

    CDLT.

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par taska
    ... mea culpa.

    Avec un nvl au cas où le N serait supérieur au nombre de mots afin renvoyer la chaine complète.

    CDLT.

    bien vu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT t,n,
    substr(t,1,decode(instr(t,' ',1,n),0,length(t),instr(t,' ',1,n)-1)) s 
    FROM t;

  11. #11
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT t,n, NVL(substr(t,1,instr(t,' ',1,n)), t) s 
    FROM t;

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    si par hasard la version est 10g, on peut employer des regexp, ce qui offre plus de flexibilité (si le séparateur n'est pas espace par exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select regexp_substr(t,'(\w+\W*){'||n||'}') from t;
    mais c'est plus lent

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    ouais, avec une micro-erreur de copier-coller qui s'est glissée...

  14. #14
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Yop, merci, j'ai corrigé

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Je ne connaissais pas WITH donc j'ai voulu testé le code de Laurent.
    Voici ce que j'obtiens :
    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
    10g SOC5> select *
      2  from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod
    PL/SQL Release 10.1.0.3.0 - Production
    CORE    10.1.0.3.0      Production
    TNS for 32-bit Windows: Version 10.1.0.3.0 - Production
    NLSRTL Version 10.1.0.3.0 - Production
     
    5 ligne(s) sélectionnée(s).
     
    10g SOC5> ed
    A écrit fichier  afiedt.buf
     
      1  WITH t AS (SELECT 'Ma plus belle requete en sql' t, 3 n FROM dual)
      2* SELECT t,n,substr(t,1,instr(t,' ',1,n)) s FROM t
    10g SOC5> /
    Erreur interne SQL*Plus internal, état 2091, contexte 0 :0 :0
    Il n'est pas conseillé de poursuivre
    10g SOC5>
    Vous avez une explication ?

  16. #16
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    quelle est ta version de sqlplus?

  17. #17
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL*Plus: Release 8.0.6.0.0 - Production on Je Jan 18 17:26:55 2007
     
    (c) Copyright 1999 Oracle Corporation.  All rights reserved.
     
     
    Connecté à :
    Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Production
    With the Partitioning, OLAP and Data Mining options
    PS : en lisant la doc Oracle à propos de WITH, j'ai essayé d'écrire une requête de mon cru et ça passe encore moins ; en tout cas je ne peux pas écrire mes lignes au fur et à mesure.

  18. #18
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Fallait le voir en tout petit :
    Citation Envoyé par laurentschneider
    Motif: si ta version client est 8i ou plus ancienne, c'est tout normal ...

  19. #19
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Effectivement : je pensais qu'il s'agissait uniquement d'un problème de version de base mais non en fait :
    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
     
    SQL*Plus: Release 9.0.1.4.0 - Production on Thu Jan 18 18:00:22 2007
     
    (c) Copyright 2001 Oracle Corporation.  All rights reserved.
     
     
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Production
    With the Partitioning, OLAP and Data Mining options
     
    SQL> WITH t AS (SELECT 'Ma plus belle requete en sql' t, 3 n FROM dual)
      2  SELECT t,n,substr(t,1,instr(t,' ',1,n)) s FROM t;
     
    T                                     N S
    ---------------------------- ---------- ----------------------------
    Ma plus belle requete en sql          3 Ma plus belle
     
    SQL>
    Merci MCM

  20. #20
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Par défaut Merci beaucoup !
    A vrai dire, je ne m'attendais pas à avoir autant de réponses !

    En tout cas, ça me débloque, merci à tous !

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

Discussions similaires

  1. comment afficher les 2 premiers mots d'un champ?
    Par Mydriaze dans le forum Requêtes
    Réponses: 5
    Dernier message: 06/08/2010, 15h19
  2. Réponses: 2
    Dernier message: 05/04/2007, 15h19
  3. [MySQL] Recuperer les deux premiers caracteres d'un champ
    Par Msieurduss dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 15/06/2006, 15h40
  4. afficher les n premiers caractères d'un champs
    Par kabool dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/03/2006, 19h22
  5. Réponses: 2
    Dernier message: 04/09/2004, 11h53

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