2011-08-01 4 views
3

J'ai une colonne 'nom' dans la base de données qui a des valeurs comme 'john, smith'. Je passe une variable de chaîne 'name_respository' à une procédure stockée qui a des valeurs comme 'test, test1, john, test2' ou 'temp, smith, temp1, temp2'. Les valeurs de variable de chaîne 'name_repository' sont générées à l'exécution, elles peuvent être temporaires ou test.Comment comparer une valeur séparée par des virgules dans une colonne avec une collection de chaînes dans Oracle

Maintenant, voici ce que j'essaie de faire, j'essaie de sélectionner des lignes où le nom est dans name_repository. Le problème est que j'ai 'john, smith' comme nom alors que name_repository en a seulement un. J'ai besoin de diviser la variable de nom john et smith et ensuite comparer avec la collection et retourner les lignes. Maintenant la variable que je passe peut avoir smith ou john ou james ou pierre et d'autres valeurs de rebut. Je devrais être retourné les lignes 1 et 3 si j'ai smith ou john comme paramètre.

requête doit être quelque chose comme

Select * from table where name in name_repository 

Répondre

1

Utilisez instr() pour trouver la virgule dans votre paramètre
Utilisez Substr() pour sélectionner le texte à partir du côté gauche et à droite de votre paramètre. Par exemple:

Substr('john,smith',1,instr('john,smith',',')-1) to give you 'john' 
Substr('john,smith',instr('john,smith',',') to give you 'smith' 

Et puis il suffit de mettre ces déclarations dans votre clause WHERE

Where 'john' in(name_repository) OR 'smith in(name_repository) 

OU ... il suffit d'écrire votre propre fonction split ... :-)

+0

Je n'ai pas essayé d'autres réponses mais c'était le plus rapide et le plus soigné – gizgok

2

vous pourriez diviser le noms comme celui-ci:

SELECT REGEXP_SUBSTR (name, '[^,]+', 1, LEVEL) data 
FROM table 
CONNECT BY LEVEL <= LENGTH(name) - LENGTH(REPLACE(txt, ',')) + 1 
0

Regardez le lien suivant: link

Il semble une solution compacte pourrait être la suivante:

SQL> SELECT str 
    2 ,  REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) AS single_element 
    3 ,  LEVEL         AS element_no 
    4 FROM (
    5   SELECT ROWNUM AS id 
    6   ,  str 
    7   FROM t 
    8  ) 
    9 CONNECT BY INSTR(str, ',', 1, LEVEL-1) > 0 
10   AND id = PRIOR id 
11   AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL; 

STR       SINGLE_ELEMENT     ELEMENT_NO 
------------------------------ ------------------------------ ---------- 
X,Y,Z       X          1 
X,Y,Z       Y          2 
X,Y,Z       Z          3 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG XXX          1 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG Y          2 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG ZZ          3 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG AAAAA         4 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG B          5 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG CCC          6 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG D          7 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG E          8 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG F          9 
XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG GGG         10 

13 rows selected. 
Note that the in-line view is required to alias ROWNUM (as it cannot be used directly in the PRIOR clause on line 10). 
0

simple pourrait être:

select * from table 
where regexp_replace(name,'^.*,','') in name_repository 
or regexp_replace(name,',.*'') in name_repository; 

Le premier regexp zaps le premier nom de la chaîne, la deuxième la deuxième prénom.

Questions connexes