2017-01-18 8 views
0

その値に基づいて列の名前を取得する方法はありますか。Oracle:テーブルの値に基づいて列名を取得

例については

のは、私はすべての回で1行しか持っていますが、別のスキーマとは異なり、テーブルと呼ばれるアクセス権を持っているとしましょう。また、値は0または1のいずれかにしかなりません)

value = '1'に基づいて列 'field0'を選択する方法はありますか?

私は特定のテーブルのコードを使用してそれを行うことができますが、私はそれをOracleクエリーを使用して実行したいと考えています。

私が持っていた唯一のアイデアは

select column_name from ALL_TAB_COLUMNS where TABLE_NAME='table' -- but no way to check for value; 

を確認することでした任意の提案は大歓迎されています。

+0

標準SQLではなく、これには動的SQLが必要ですが、これは一般的には良い考えではありません。この質問につながるビジネス上の問題は何ですか?おそらくもっと良いアプローチがあります。 – mathguy

+0

目標は、このクエリから返された列名に基づいてフォームフィールドを表示/非表示にすることでした。しかし、私はすべてのページのためにこれを処理するクラスを構築したい、各ページのためにこれを行う必要はありません。 – user1751510

+0

これは奇妙な設定ですが、all_tab_columnsをあなたの "アクセス"テーブルに参加させてみましたか?しかし、私はmathguyに同意します。おそらくより良いアプローチです。 – tbone

答えて

1

あなたのアプローチは不適切であり、ビジネスの列名を参照する代わりにACCESSテーブルのレコードのようなプロパティを持つなど、シナリオを処理する方がはるかに優れています。

ただし、以下の方法でシナリオを達成することができます。

DECLARE 
    columnName varchar(128); 
    sql_stmt VARCHAR2(500); 
    input1 VARCHAR(20); 
    input2 VARCHAR(20); 
BEGIN 
    input1 := '1'; 
    input2 := 'schema_Name'; 
    FOR r IN (select column_name from ALL_TAB_COLUMNS where OWNER = 'DUMMY_TABLE' AND TABLE_NAME='T_PA_CASE' AND DATA_TYPE = 'VARCHAR2') LOOP 
    BEGIN 
    sql_stmt := 'select ' || r.column_name || ' from ' || input2 || '.ACCESS WHERE ' || r.column_name || ' = :1'; 
    EXECUTE IMMEDIATE sql_stmt INTO columnName USING input1; 
    DBMS_OUTPUT.PUT_LINE('First Matched Column is ----'||r.column_name); 
    exit; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    CONTINUE; 
    END; 
    END LOOP; 
END; 

出力 - 最初に一致した列名は ---- FIELD0

は、あなたが取得するために、比較される機能にこれを微調整し、スキーマ名と値の入力を送信しなければならないです一致する最初の列名の出力。

+0

ありがとうSrikanth、私はそれを試してみましょう。 – user1751510

関連する問題