Bonjour,

Je déplace mon dernier post qui situé dans un thread "resolu", n'a surement pas la visibilité nécessaire, en espérant que les modérateurs ne m'en veuillent pas.

C'est donc la suite corrigée et commentée de : http://www.developpez.net/forums/showthread.php?t=65198

---------------------------------------------------------

J'ai une table 'table' avec deux champs 'id' et 'num' qui contient des chaines du type :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
create table test (id number, num varchar2(255));
insert into test values (1,'12,12345, A345, TOTO'); 
insert into test values (2,'454'); 
insert into test values (3,'13,454');
Je veux comme résultat final dans une autre table 'result' avec comme pour sequence, l'ordre d'afichage des valeurs de num pour chaque id

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
id num   sequence
1  12    1
1  12345 2 
1  A345  3 
1  TOTO  4 
2  454   1 
3  13    1 
3  454   2

En lisant le thread d'origine, je suis arrivé à des premiers résultats intéressants avec la requête suivante :
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
 
Drop table result;
Create table result (id number , num varchar2(50), seq number);
 
	insert into result (id, num)
		select 
			id, 
			trim(substr(num, instr(num,',',1,rr.r)+1, instr(num,',',1,rr.r+1)-instr(num,',',1,rr.r)-1 )) AS num
	from
		(select 
			id, 
			','||num||',' AS num, 
			length(num)-length(replace(num,',',''))+1 AS cnt 
		from test ) test,
		(select 
			rownum r 
		from all_objects) rr 
	where 
		rr.r <= test.cnt ;
 
select id, num from result;
1 - est ce possible de la simplifier ?
2 - l'ordre d'insertion n'est pas le bon non plus mais quand le champ séquence sera rempli cela ne posera pas de problème
3 - comment incrémenter/remplir le champ séquence ?
Est-ce jouable en SQL seul ou faut-il du PL/SQL ?


La deuxième partie du pb consiste à ne pas inserer certaines valeurs. Par exemple comment créer une liste de valeur qui ne doivent pas être inséré dans la table : par exemple si je ne veux pas intégrer les valeurs 12 et 13 voici ce que je voudrais obtenir :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
id, num, sequence 
1 12345 1 
1 A345  2 
1 TOTO  3 
2 454   1 
3 454   1

Il ya une troisième partie mais je vais m'arrêter ici.

Merci pour votre aide