2016-09-12 5 views
0

列が表に存在しない場合は、列のデフォルト値を選択しようとしています。次のコードは、私の期待される出力を与えてくれないようです。誰かが私に上記のコード中の溶液またはエラーを提案することができますoracleに列が存在しない場合のデフォルト値を選択

CustomerID | Age 
-----------|---- 
Cust01  | 0 
Cust02  | 0 

- :

SELECT CustomerID, (select case when exists (select * 
         from INFORMATION_SCHEMA.COLUMNS 
         where table_name = 'Customers' and 
          column_name = 'Age' 
        ) 
      then Age 
      else 0 as Age 
    end) 
FROM (select * from Customers); 

Age列がテーブルの結果には存在しないためには、として与えられるべきです。

+3

あなたは、動的SQLを使用しなければならないでしょう。通常のSELECTは、存在しないカラムを参照することはできません。 –

+4

私はOracleをよく知らないので、これを完全な答えとして掲示するつもりはないですが、ほぼすべてのDBシステムのように信じています。クエリのコンパイルでは、すべてのオブジェクト(ここでは列)が存在する必要がありますクエリの実行)。ダイナミックSQLはあなたの唯一の選択肢だと思います。 –

+1

12cで新しいものでない限り、フラグシップOracleデータベースには「INFORMATION_SCHEMA」はありません。おそらくこれはMySQLにタグを付けることを意味しましたか?もしそうなら、 '[oracle]'タグは、オラクルの主力データベースを参照する質問にのみ使用されるべきであり、JavaやMySQLなどの他のオラクル製品には使用されないことに注意してください。 –

答えて

0

専門家のコメントに記載されているように、Oracle PLSQLブロックを使用し、動的SQLを使用して要件を満たす必要があります。あなたの要求を念頭に置いて書かれた同じコードを以下に見てください。あなたはこれであなたのコードを実行しようとすることができます

declare 

var number; 

var2 varchar2(4000); 

type abc is record 
(col1 number, 
    col2 number); 

type var3 is table of abc index by pls_integer; 

var4 var3; 


begin 

select count(1) 
into var 
from employee; 

var2:= 'select A, '||case when var is null then 1 else 2 end || ' from test where rownum < 10'; 


dbms_output.put_line(var2); 

execute immediate var2 bulk collect into var4; 

for rec in 1..var4.last 
loop 

dbms_output.put_line(var4(rec).col1 ||',' ||var4(rec).col2); 

end loop; 

end; 

出力:

select A, 2 from test where rownum < 10 
1444,2 
1445,2 
1446,2 
1447,2 
1448,2 
1449,2 
1450,2 
1451,2 
1452,2 
関連する問題