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 19/09/2011, 15h24   #1
Nouveau Membre du Club
 
Inscription : septembre 2006
Messages : 59
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : septembre 2006
Messages : 59
Points : 29
Points : 29
Par défaut Split d'une chaine de caractères

Bonjour à tou(te)s,
Je cherche à faire dans une requête SQL un split à la façon java (machaine.split("#");) d'une chaîne de caractères :


Merci de vos suggestions.
ourseblanche est déconnecté   Envoyer un message privé Réponse avec citation 12
Vieux 19/09/2011, 16h13   #2
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Ma suggestion serait de prendre le temps de décrire en détail votre probleme.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 42
Vieux 19/09/2011, 16h55   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
bein .. il veut faire un split ..

Il n'y a pas de fonction de split sous oracle, il faut le coder (avec des substr et des instr). Il y a plein d'exemples ou de posts là dessus.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 31
Vieux 19/09/2011, 17h30   #4
Nouveau Membre du Club
 
Inscription : septembre 2006
Messages : 59
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : septembre 2006
Messages : 59
Points : 29
Points : 29
Si la chaine de caractères est de taille fixe et le séparateur tombant toujours au même endroit je pourrais utiliser un SUBSTRING.
Mais j'ai un autre cas où les champs de la base sont de la forme AAAAA_BBB et je veux l'information AAAAA (de taille variable).
Comment faire ?
ourseblanche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 17h36   #5
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Citation:
Envoyé par McM Voir le message
bein .. il veut faire un split ..
j'imagine bien mais sur quel séparateur ? un exemple ?

quel resultat veut on obtenir ? quel base oracle utilisée ?
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 17h49   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
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 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous avez des pistes intéressantes dans ce sujet :
http://www.developpez.net/forums/d11...re-commencant/

Faites aussi quelques recherches sur ce forum, c'est une question récurrente.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/09/2011, 19h48   #7
Rédacteur
 
Inscription : décembre 2002
Messages : 2 387
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 387
Points : 3 272
Points : 3 272
Citation:
Envoyé par McM Voir le message
bein .. il veut faire un split .. .
Pour ma part, je n'ai pas la moindre idée de ce que ça veut dire...
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 09h22   #8
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Autant je suis d'accord que parfois il est nécessaire que la personne qui pose la question explique précisément ce qu'elle veut, autant des fois (et ici c'est vraiment le cas), il est nécessaire que les personnes qui lui répondent fassent un minimum d'effort pour comprendre.

Il veut reproduire le comportement de la fonction SPLIT, qui existe dans tous les langages de haut niveau.

Il n'y a pas plus clair comme demande.

En revanche, il n'a pas trop cherché, puisque les deux premiers liens dans Google pour "oracle split function" répondent tous les deux à sa demande.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 20/09/2011, 10h35   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
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 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par StringBuilder Voir le message
Il veut reproduire le comportement de la fonction SPLIT, qui existe dans tous les langages de haut niveau.

Il n'y a pas plus clair comme demande.
À condition de connaître des langages de haut niveau, ce qui n'est pas un prérequis dans les bases de données ou le SQL.

À partir du moment où la traduction de split signifie séparer, on a une vague idée, mais une vague idée c'est quand même loin de l'approche rigoureuse que demande n'importe quel développement, aussi minime soit-il.

Par exemple, résultat en lignes ou en colonnes ?
Rien que ce détail change toute l'approche de la solution, les demandes d'éclaircissements ne me paraissent pas déplacées ici.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/09/2011, 10h58   #10
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Je ne suis pas d'accord.

Il n'est pas nécessaire de connaître Java, PHP, VB ou C# pour poster dans la catégorie base de données.

Je suis parfaitement d'accord.

En revanche, la question est on ne peut plus claire, et explique d'entrée de jeu qu'il cherche à reproduire une fonction JAVA.
=> La moindre des choses avant de répondre n'importe quoi, c'est déjà de se renseigner sur ladite fonction. Si on ne connait pas Java et qu'on n'a pas envie de faire l'effort de regarder ce que c'est, alors ne passe son chemin sans rien dire.
http://download.oracle.com/docs/cd/E.../split.fn.html

Citation:
Envoyé par ourseblanche Voir le message
Je cherche à faire dans une requête SQL un split à la façon java (machaine.split("#");) d'une chaîne de caractères.
Ensuite, dans son exemple, il poste un exemple avec le délimiteur "#".
=> Je me demande bien pourquoi 2 postes plus loin on lui reproche de ne pas dire quel séparateur il veut : on peut au moins reprendre celui de son exemple.

Ceci dit, au final, on se moque éperduement du séparateur, puisque c'est bien le rôle de la fonction split : transformer une chaine de caractère en un tableau (donc un curseur/table dynamique) selon un séparateur qui est spécifié en paramètre.

Même si je dois m'attirer les foudres de la modération, je persiste et signe : je ne suis pas du tout d'accord avec l'acceuil qui a été fait à ce topic.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 20/09/2011, 11h04   #11
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
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 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par StringBuilder Voir le message
En revanche, la question est on ne peut plus claire, et explique d'entrée de jeu qu'il cherche à reproduire une fonction JAVA.
=> La moindre des choses avant de répondre n'importe quoi, c'est déjà de se renseigner sur ladite fonction. Si on ne connait pas Java et qu'on n'a pas envie de faire l'effort de regarder ce que c'est, alors ne passe son chemin sans rien dire.
Mais c'est le monde à l'envers.
C'est donc celui qui souhaite aider qui doit aller à la pêche aux informations ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 11h14   #12
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Citation:
Envoyé par StringBuilder Voir le message
il est nécessaire que les personnes qui lui répondent fassent un minimum d'effort pour comprendre.
Justement en ce moment je bosse avec la MOA en pleine phase de recettage de mon projet. Ces derniers me pondent des anos qui contiennent comme unique description : "ça marche pas".
Ce à quoi je répond : "Quoi qui marche pas, quelle fonctionnalité, que devrait elle faire, pour quel cas de test, etc. .. "

Bref mon point ici était de dire : si tu veux une réponse claire, ciblée et rapide, alors fournis un max d'infos pour que les gens que tu sollicites le soient de façon efficace.

Je ne connais rien en java et pour moi
Citation:
(machaine.split("#")
ne veut rien dire.
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/09/2011, 11h51   #13
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Java fait l'objet de spécifications très précises.

Quoi de plus précis que de demander à reproduire une fonctionnalité de quelquechose qui est déjà spécifié ?

Refaire une spécification aproximative ?

Si je te demande avec SQL Server "comment faire une requête qui retrouve le papa et la maman du fiston avec l'age du capitaine", tu trouves ça plus clair que si je te demande l'équivalent de CONNECT BY PRIOR d'Oracle ?

Désolé, moi pas.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 20/09/2011, 12h44   #14
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 926
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 926
Points : 4 547
Points : 4 547
bon, une piste serait les regexp

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SQL> var str varchar2(40)
SQL> exec :str := 'abc#de#f##ghij'
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,1),'#')  FROM dual
abc
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,2),'#')  FROM dual
de
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,3),'#')  FROM dual
f
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,4),'#')  FROM dual
 
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,5),'#')  FROM dual
ghij
PS: quoi que InStr et SubStr vont très bien aussi!
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 13h29   #15
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Non.

Une recherche sur Google de la phrase "oracle split function" retourne des exemples de mise en place de la fonction split en PL/SQL.

Si on fait le tri, un lien dans un forum propose un des débats très intéressants sur les performances des diverses solutions proposées (pas moins de 10 solutions différentes) permettra à l'auteur du topic de trouver son bonheur en fonction du contexte dans lequel il a besoin de la fonction (nombre de chaines à traiter, taille des chaines, etc.)
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 17h44   #16
Nouveau Membre du Club
 
Inscription : septembre 2006
Messages : 59
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : septembre 2006
Messages : 59
Points : 29
Points : 29
Citation:
Envoyé par laurentschneider Voir le message
bon, une piste serait les regexp

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SQL> var str varchar2(40)
SQL> exec :str := 'abc#de#f##ghij'
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,1),'#')  FROM dual
abc
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,2),'#')  FROM dual
de
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,3),'#')  FROM dual
f
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,4),'#')  FROM dual
 
SQL> SELECT REPLACE(regexp_substr(:str,'[^#]*#?',1,5),'#')  FROM dual
ghij
PS: quoi que InStr et SubStr vont très bien aussi!
Oui ! ça, ça me va ! Merci, merci !

Beaucoup de bruit pour une si petite demande.
Je vous prie de m'excuser si elle n'était pas très claire (y a bien qu'une fille pour penser que les autres comprennent ce qu'elle a dans la tête...).
Merci à tou(te)s.
ourseblanche est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/09/2011, 21h02   #17
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 926
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 926
Points : 4 547
Points : 4 547
split existe dans la plupart des langages, shell, perl, awk, java et autres.

lit aussi http://fdegrelle.over-blog.com/article-1342263.html pour une solution plsql

et puis tu peux aussi écrire une fonction plsql qui fait du java, comme sur http://laurentschneider.com/wordpres.../06/epoch.html

et fi des mâles qui se pavanent alentour, ce forum est modéré et toute réponse qui n'entre pas dans la chartre de l'utilisateur est savamment censurée
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider 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 03h19.


 
 
 
 
Partenaires

Hébergement Web