前提・実現したいこと
現在、複数のORACLEのDBがあり、新システムへの刷新にあたりDBも変更しPostgreSQLに移行します。
移行にあたり、移行データを抽出するために、現在のORACLEのDBからデータを抽出しようとしています。
(sqldevelopper、a5m2などのDBツールを使用して抽出したい。)
そこで、同じテーブル名でカラムの構成が異なるDBがあります。
テーブルのカラム構成が異なっても、1つSQL文で、データを抽出できるようにしたいです。
移行元:ORACLE (DB:1)
テーブル名:TEST_TABLE
カラム:A,B,C
移行元:ORACLE (DB:2)
テーブル名:TEST_TABLE
カラム:A,B
移行先:PostgresSQL (DB:C)
テーブル名:TEST_TABLE
カラム:A,B,C
■実現したいこと
TEST_TABLEから存在しないカラムCがある場合は、NULLを設定し、カラムCが存在するとそのデータをそのまま抽出する
発生している問題・エラーメッセージ
エラーメッセージ
ORA-00904: 無効な識別子です
該当のソースコード
SELECT A,B ,CASE WHEN (SELECT COUNT(COLUMN_NAME) FROM ALL_TAB_COLUMNS WHERE OWNER = 'オーナ名' AND TABLE_NAME = 'TEST_TABLE' AND COLUMN_NAME = 'C') = 1 THEN C ELSE NULL END FROM TEST_TABLE;
試したこと
目標:TEST_TABLEのカラムcが存在しない場合は、nullを設定し、カラムcが存在する場合はカラムcを設定したい。
カラムの存在有無は、下記のようにカウントが「1:カラムが存在する or 0:カラムが存在しない」の場合で判別できるが、「1」の場合にcase文で、カラムcを設定しているとエラーとなる。
if文のように条件に合致しなければ、if文の中の処理を通らないようにできれば上記目標は達成できそうなのですが...。
case文だと条件に合致しなくても、case文の中の処理を通っているようで、上記エラーが発生していると思います。
他にやり方があれば教えてください。
SELECT A,B
,CASE WHEN (SELECT COUNT(COLUMN_NAME) FROM ALL_TAB_COLUMNS WHERE OWNER = 'オーナ名' AND TABLE_NAME = 'TEST_TABLE' AND COLUMN_NAME = 'C') = 1 THEN C
ELSE NULL
END
FROM TEST_TABLE;
補足情報(FW/ツールのバージョンなど)
DB:oracle 12c