2016-05-25 11 views
0

私は、以下のOracleテーブルを持っています:col_mappingこのテーブルのカラムは、別のテーブルのカラムのカラム値を持ちます。テーブルのWhere句内の1つのテーブルのカラム値の使用

例データ:上記の表に基づき

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

をcol_mappingは、私が今col_mappingに各レコードを経ると呼ばれる別のテーブルに私のWHERE条件の一部としてCOL_VALSを使用したいですother_tab、すなわち:

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

私は基本的にWHERE条件や場所があり、複数の値結腸separaにCOL_VALSを分割したいです上記の例のようにOR条件にします。

上記のOracleを達成する方法についての助けがあれば大丈夫です。

ありがとうございました。

+0

ので、SQLのすべてに対してです。あなたはそれを完全に再設計することを検討すべきです。 –

+0

[Dynamic SQL](https://oracle-base.com/articles/8i/native-dynamic-sql)を試しましたか? – Hawk

+0

@juergend非常に真ですが、私は純粋にこれを処理する必要があるマッピングテーブルの一部として使用しています。 – tonyf

答えて

0

これはテストされていません。しかし、これは私がそれを信じる方法は達成することができます。 2つのループが必要です。 1つは表col_mappingをループし、もう1つは各行の列COL_VALSをループしてwhere条件を構成します。このような

何か:

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; 
/
関連する問題