- ベストアンサー
テーブルの列名をデータとして設定しておき値を取得する方法
- テーブルAとテーブルBのキーを指定して、テーブルAの列名を元にテーブルBから値を取得する方法について紹介します。
- テーブルAにはテーブルBの列名がデータとして登録されており、テーブルBには値が格納されています。
- テーブルAとテーブルBを結合して、1回のSQLで値を取得する方法も紹介します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
え~と・・・時間ができたので(笑)SQL版をば -- keyの設定(SQL*Plusでの実行を想定) VARIABLE v_key NUMBER EXECUTE :v_key := 1 -- なんか…無理矢理だな~、DB設計が悪いんだよな(笑)版 SELECT MAX(CASE WHEN A.fno = 1 THEN B.fvalue END) AS field1, MAX(CASE WHEN A.fno = 2 THEN B.fvalue END) AS field2, MAX(CASE WHEN A.fno = 3 THEN B.fvalue END) AS field3 FROM ( SELECT 1 AS fno, field1 AS fname FROM テーブルA WHERE key = :v_key UNION ALL SELECT 2 AS fno, field2 AS fname FROM テーブルA WHERE key = :v_key UNION ALL SELECT 3 AS fno, field3 AS fname FROM テーブルA WHERE key = :v_key ) A, ( SELECT 'item1' AS fname, item1 AS fvalue FROM テーブルB WHERE key = :v_key UNION ALL SELECT 'item2' AS fname, item2 AS fvalue FROM テーブルB WHERE key = :v_key UNION ALL SELECT 'item3' AS fname, item3 AS fvalue FROM テーブルB WHERE key = :v_key UNION ALL SELECT 'item4' AS fname, item4 AS fvalue FROM テーブルB WHERE key = :v_key UNION ALL SELECT 'item5' AS fname, item5 AS fvalue FROM テーブルB WHERE key = :v_key ) B WHERE A.fname = B.fname / 「動的SQL」をオススメします。
その他の回答 (2)
- dda167
- ベストアンサー率76% (55/72)
イメージですか? set serveroutput on DECLARE v_recA テーブルA%ROWTYPE; V_sql VARCHAR2(1000); v_ret1 NUMBER; v_ret2 NUMBER; v_ret3 NUMBER; BEGIN v_sql := 'SELECT * FROM テーブルA WHERE key = :key'; EXECUTE IMMEDIATE v_sql INTO v_recA USING 1; v_sql := 'SELECT '||v_recA.field1||','||v_recA.field2||','||v_recA.field3||' FROM テーブルB WHERE key = :key'; EXECUTE IMMEDIATE v_sql INTO v_ret1, v_ret2, v_ret3 USING 1; DBMS_OUTPUT.PUT_LINE(v_ret1||','||v_ret2||','||v_ret3); END; / 「動的SQL」について詳しいことを知りたければ「ORACLE 動的SQL」でGOOGLE先生に訊いてください。 無理をしてSQLでできないこともないと思いますが (パズルとしては面白いかもしれませんが、時間がないので…) 「動的SQL」を使うほうが素直で無難だと思います(初心者ならなおさら)。
- dda167
- ベストアンサー率76% (55/72)
「動的SQL」を使うのはヤダ! ってことですか?
補足
初心者ですみません。 動的SQLで列名自体を変える事も可能って事でしょうか? たとえば、どういうイメージになりますでしょうか?
お礼
お返事が遅くなりました。 解決しました。 どうも、ありがとうございます。