8
votes

Utilisation de la clause "In" avec une chaîne délimitée de virgule de la sortie d'une fonction de remplacement () dans Oracle SQL

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);


1 commentaires

Le nombre d'identifiants dans la liste est-il limité?


5 Réponses :


11
votes

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 ) )
    )


1 commentaires

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".



4
votes

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
  );


1 commentaires

Bonjour Markus, merci à toi. La solution fournie par vous à l'aide de Pure SQL fonctionne parfaitement. Merci à vous et à Justin pour votre aide.



2
votes

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: xxx pré>

Voir cet exemple: p>

EMPLOYEE_NUMBER
101
102


0 commentaires

0
votes

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.


0 commentaires

-1
votes

Vous pouvez utiliser REGEXP_SUBSTR fonction FORT> pour obtenir la sortie attendue.
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 " xxx pré>

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.
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


0 commentaires