Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/01/2012, 11h27   #1
Invité de passage
 
Inscription : août 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 15
Points : 2
Points : 2
Par défaut Insertion des slash entre les caractères d'une chaine

Bonjour,

je voulais faire une requête SQL sous Oracle qui me donne la chose suivante :

bonjour ===>/b/o/n/j/o/u/r/

est c'est possible sous Oracle?

Merci.
hadi2007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 11h43   #2
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

A partir de 10g,

Code :
1
2
3
4
5
6
7
8
 
SQL> SELECT regexp_replace('bonjour', '(.)', '\1/')
  2  FROM dual
  3  /
 
REGEXP_REPLACE
--------------
b/o/n/j/o/u/r/
Edit : plus vite que super-modo, mais moins bien lu l'énoncé... pas vu le premier slash
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 24/01/2012, 11h44   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
En 10g+ vous avez les expressions régulières :
Code :
1
2
3
4
5
6
SELECT regexp_replace('bonjour', '(.)', '/\1') || '/' AS mot
  FROM dual;
 
MOT            
---------------
/b/o/n/j/o/u/r/
Edit : grillé par la boule jaune !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 24/01/2012, 12h13   #4
Invité de passage
 
Inscription : août 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 15
Points : 2
Points : 2
Merci pour vos reponses rapides,

la mauvaise nouvelle c'est que je fonctionne sous Oracle 9.2i

je ne sais pas est ce qu'il existe une solution sous cette version d'Oracle?

Merci d'avance.
hadi2007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 12h23   #5
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Crée une fonction qui prend en paramètre ta chaîne, itère dessus pour ajouter les /, puis retourne le résultat.

Sinon, si tu veux un truc dégueu et contre performant et en mode bug-using, tu as :
Code :
1
2
3
4
5
6
7
8
9
 
WITH t AS (
SELECT 'bonjour' msg 
FROM dual
)
SELECT (SELECT REPLACE(REPLACE(xmlagg(xmlelement("x", '/' || substr(t.msg, level, 1))), '</x>', ''), '<x>', '')
        FROM dual
        connect BY level <= length(t.msg)) || '/'
FROM t
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 12h31   #6
Invité de passage
 
Inscription : août 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 15
Points : 2
Points : 2
Merci pacmann , oui je vois ....je suis victime de la version 9i d'Oracle, je suis pour créer une fonction propre qui gère ça (comme vous l'avez recommendé).

pouvez-vous m'aider à créer cette fonction?

thank's in adavnce.
hadi2007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 14h04   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Quelque chose comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE OR REPLACE FUNCTION f_slash_string (p$_input IN varchar2)
RETURN varchar2 DETERMINISTIC
IS
    v$_string    varchar2(100) DEFAULT '/';
BEGIN
    FOR i IN 1..length(p$_input)
    LOOP
      v$_string := v$_string || substr(p$_input, i , 1) || '/';
    END LOOP;
    RETURN (v$_string);  
END f_slash_string;
/
 
 
SELECT f_slash_string('bonjour') AS slash
  FROM dual;
 
SLASH          
---------------
/b/o/n/j/o/u/r/
Ou avec la méthode de Pacmann (légèrement modifiée, au lieu de concaténer le slash j'ai utilisé le replace de la balise ouvrante) :
Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION f_slash_string (p$_input IN varchar2)
RETURN varchar2 DETERMINISTIC
IS
    v$_string    varchar2(100);
BEGIN
        SELECT REPLACE(REPLACE(xmlagg(xmlelement("x", substr(p$_input, level, 1))), '</x>', ''), '<x>', '/') || '/' INTO v$_string
          FROM dual
    CONNECT BY level <= length(p$_input);
    RETURN (v$_string);
END f_slash_string;
/
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 14h46   #8
Invité de passage
 
Inscription : août 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 15
Points : 2
Points : 2
Merci Waldar,

Votre fonction marche bien.

Mon problème est résolu.

Thank's.
hadi2007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h26.


 
 
 
 
Partenaires

Hébergement Web