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.
Version imprimable
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.
Ma suggestion serait de prendre le temps de décrire en détail votre probleme.
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.
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 ?
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.
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.
À 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.
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
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.
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 moine veut rien dire.Citation:
(machaine.split("#")
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.
bon, une piste serait les regexp
PS: quoi que InStr et SubStr vont très bien aussi!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
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.)
Oui ! ça, ça me va ! Merci, merci ! :ccool:
Beaucoup de bruit pour une si petite demande. :oops:
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.
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
Ouah c'est ce que je cherchais aussi, ça pète comme regexp :-)
bonjour ,
je cherchais une astuce pour faire ce type de fonction de split pour sql , je suis tombé sur ce post qui m'a conduit à une solution trouvé sur internet, que je souhaitai partager au cas ou cela intéresserez quelqu'un :
Ps: fonctionne en 11G r2Code:
1
2
3 select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;
Bonjour,
désolé du réveil, mais comme ce fil (assez tumultueux d'ailleurs ;)) arrive en 2nde position dans Google pour "oracle split", je me permets d'ajouter une petite remarque :
Il me semble que quand on sait qu'il n'y a jamais 2 caractères séparateurs à suivre (ou quand on s'en fiche), on peut utiliser plus simplement ceci :
La différence avec l'autre exemple, c'est qu'on ne récupère pas la chaîne vide en 4ème position mais on récupère directement la 5ème :Code:select regexp_substr(:str,'[^#]+',1,1) from dual
a+Code:
1
2
3
4
5
6
7
8
9
10 SQL> var str varchar2(40) SQL> exec :str := 'abc#de#f##ghij' SQL> select regexp_substr(:str,'[^#]+',1,1) from dual abc SQL> select regexp_substr(:str,'[^#]+',1,2) from dual de SQL> select regexp_substr(:str,'[^#]+',1,3) from dual f SQL> select regexp_substr(:str,'[^#]+',1,4) from dual ghij