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 !
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 :Envoyé par keskispas
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.
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
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; /CDLT.1* select left_substr('Salut toto comment vas tu ?',' ',4) result from dual
SQL> /
RESULT
-------------------------------------------------------------------------------
Salut toto comment vas
substr(t,1,instr(t,' ',1,n)) fonctionne sans aucun doute dans Oracle 4, tu veux dire quoi par ancienne base?
WITH t AS ne fonctionne pas en 8.05 entre autres ,
le monde n'est pas composé que de 10gR2 ....
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
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
... mea culpa.
Avec un nvl au cas où le N serait supérieur au nombre de mots afin renvoyer la chaine complète.
CDLT.
Envoyé par taska
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;
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;
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)
mais c'est plus lent
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select regexp_substr(t,'(\w+\W*){'||n||'}') from t;![]()
ouais, avec une micro-erreur de copier-coller qui s'est glissée...
Yop, merci, j'ai corrigé![]()
Je ne connaissais pas WITH donc j'ai voulu testé le code de Laurent.
Voici ce que j'obtiens:
Vous avez une explication ?
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>
quelle est ta version de sqlplus?
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.
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
Fallait le voir en tout petit :
Envoyé par laurentschneider
Effectivement : je pensais qu'il s'agissait uniquement d'un problème de version de base mais non en fait :
Merci MCM
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>
A vrai dire, je ne m'attendais pas à avoir autant de réponses !
En tout cas, ça me débloque, merci à tous!
Partager