J'ai une chaîne délimitée des virgules que je souhaite utiliser dans une clause "dans" de la déclaration. Par exemple: 100,101,102
Depuis la clause de "in", je dois citer les chaînes individuelles, j'utilise une fonction de remplacement: par exemple: Sélectionnez '' '' || Remplacer ('100,101,102', ',' ',' '', '' ',' '', '' '', '' '', '' '', '' ',' '') || '' ') ||' '' ') ||' '') de double; p>
La requête ci-dessus, cependant, Lorsque j'essaie d'utiliser la sortie de ce qui précède comme entrée de la clause "IN", elle ne renvoie aucune donnée. Je ne suis restreint par que des déclarations SQL, donc je ne peux donc pas utiliser le code PL / SQL. Veuillez aider. P>
select * from employee where employee_number in ( select ''''||replace('100,101,102',',',''', ''')||'''' from dual);
5 Réponses :
L'approche générale dans ce cas serait d'analyser la liste séparée par des virgules dans une collection Oracle et d'utiliser cette collection dans votre relevé SQL. Tom Kyte en a un exemple dans sa discussion sur Variable dans les listes .
En supposant que vous créez le type MyTableType et la fonction IN_LIST à partir de ce thread, vous devriez pouvoir faire P>
SELECT * FROM employee WHERE employee_number IN ( SELECT * FROM TABLE( in_list( p_your_comma_separated_list ) ) )
Bonjour Justin, merci pour la suggestion. Malheureusement, je n'ai pas accès à la base de données pour changer ou ne rien créer. J'ai seulement lu accès, c'est pourquoi je suis limité à seulement "Select".
SQL pur, mais pas très bien testé ...
select substr(postfix, 1, instr(postfix, ',' ,1)-1) from ( select substr(val, instr(val, ',',1, level)+1) postfix from (select ',101,102,103,' val from dual) connect by instr(val, ',', 2, level) > 0 );
Bonjour Markus, merci à toi. La solution fournie par vous à l'aide de Pure SQL fonctionne parfaitement. Merci à vous et à Justin pour votre aide.
Comme les valeurs séparées par des virgules contiennent uniquement des chiffres, pourquoi ne pas essayer quelque chose d'aussi simple que d'utiliser: Voir cet exemple: p> EMPLOYEE_NUMBER
101
102
Vous pouvez utiliser votre approche avec remplacer et dans si vous formatez l'ensemble de Sélectionner sous forme de chaîne - puis utilisez la chaîne avec un Refcurseur ouvert ou exécuté immédiatement. P>
Vous pouvez utiliser la requête ci-dessus iTerate à travers la chaîne séparée des virgules, recherche la virgule (, ) puis divise la chaîne en traitant la virgule comme délimiteur. Il renvoie la chaîne comme une ligne, chaque fois qu'il frappe un délimiteur.
Par exemple
Noms: = 'Smith, Allen, Ward, Jones'; - Ici, "noms" est la variable / résultat de l'entrée attendue.That peut être utilisée dans la clause dans la clause "
Voici une référence Cliquez ici P> SQL> select * from emp where ename in (
2 select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
3 connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
Le nombre d'identifiants dans la liste est-il limité?