2016-05-25 17 views
0

Ich habe eine Oracle-Tabelle namens col_mapping, wobei eine Spalte in dieser Tabelle die Spaltenwerte von Spalten aus einer anderen Tabelle enthält.Verwenden von Spaltenwerten aus einer Tabelle innerhalb einer Where-Klausel

Beispiel Daten der Tabelle:

ID DESCR  COL_VALS 
------------------------------ 
    1  LABEL  COL_1 
    2  NAME_ADDR COL_2:COL_3 
    3  SALARY COL4 

Basierend auf der obigen Tabelle col_mapping, ich mag nun durch jeden Datensatz in col_mapping gehen und die COL_VALS als Teil meines WHERE-Bedingung in einer anderen Tabelle mit dem Namen verwenden other_tab, das heißt:

select 'Y' 
from other_tab 
where COL_1 = 'whatever1'; 

select 'Y' 
from other_tab 
where (COL_2 = 'whatever2' or COL_3 = 'whatever2'); 

and finally: 

select 'Y' 
from other_tab 
where COL_4 = 'whatever4'; 

ich würde im Grunde wie COL_VALS aufzuschlüsseln in einem Zustand, wo und wo es mehr als einen Wert Kolon separa ted, stellen Sie es in eine ODER-Bedingung wie oben beschrieben.

Jede Hilfe, wie man das oben genannte in Oracle erreicht, wäre großartig.

Danke.

+0

, die so gegen alles, was in SQL ist. Sie sollten darüber nachdenken, es komplett neu zu gestalten. –

+0

Haben Sie [Dynamic SQL] (https://oracle-base.com/articles/8i/native-dynamic-sql) ausprobiert? – Hawk

+0

@juergend sehr wahr, aber ich benutze das rein als Teil einer Mapping-Tabelle, die ich verarbeiten muss. – tonyf

Antwort

0

Dies wird nicht getestet. Aber so, wie ich glaube, kann es erreicht werden. Sie benötigen zwei Schleifen. Eine Schleife durch die Tabelle col_mapping und die andere durch die Spalte COL_VALS für jede Zeile durchlaufen und die WHERE-Bedingung konstruieren.

Etwas wie folgt aus:

DECLARE 

a_where_vars APEX_APPLICATION_GLOBAL.VC_ARR2; --you can replace it with your own associative array here 
l_where_string VARCHAR2(4000); 

BEGIN 

    For i IN (SELECT id, descr, col_vals FROM col_mapping) 
    LOOP 
    a_where_vars := APEX_UTIL.STRING_TO_TABLE(i.col_vals, ':') --split values into array 

    FOR j IN 1 .. a_where_vars.COUNT LOOP 
    l_where_string := l_where_string||a_where_vars(j)||' = '||whatever_variable||' OR '; 
    END LOOP; 

    --you can remove last OR and clean up l_where_string 
    --then you query: 
    EXECUTE IMMEDIATE := ' 
    select ''Y'' 
    from other_tab 
    where '||l_where_string 
    END LOOP INTO some_binding_variables; 
    --other queries. 
END; 
/
Verwandte Themen