ORACLEでSELECTを作成しようとしています。表から3列を選択していて、それがtrueの場合はテスト(他の選択の結果)を実行したいのですが、falseの場合は2つだけを表示します。
create table t1(a int ,b int , c int) ;
select a , case when (1=1) then (b ,c)
else (b) end;
from t1 ;
あなたが何をしようとしているのかははっきりしていません。
このクエリの結果だけに興味がある場合は、これを行うことはできません。不明な数の列を返すクエリを使用することはできません。次のように、条件が満たされない限り、3 つの列と 1 つの列を null にすることができます。
SELECT a, CASE WHEN ( condition ) THEN b ELSE NULL END AS b, c
FROM t1
あなたの目標が実際にテーブルを作成することである場合 (ただし、このようなテーブル作成を行うことは強くお勧めしません)、 を使用できますEXECUTE IMMEDIATE string
。 where string
is a DDL コマンド:
DECLARE
ddl VARCHAR2(4000);
BEGIN
IF (condition) THEN
ddl := 'CREATE TABLE t1 (a NUMBER, b NUMBER, c NUMBER )';
ELSE
ddl := 'CREATE TABLE t1 (a NUMBER, b NUMBER )';
END IF;
EXECUTE IMMEDIATE ddl;
END;
つまり、pl/sql を使用して、特定の入力に依存する列を選択するカーソルを開きます。
declare
v_select_all_cols boolean := true; --set as applicable.
v_rc sys_refcursor;
begin
if (v_select_all_cols)
then
open v_rc for select a,b,c from t1;
else
open v_rc for select a,b from t1;
end if;
-- now you can return the resultset v_rc to the caller
end;
/
たとえば、sqlplus を使用した簡単なテスト ( var
pl/sql 変数の代わりに a を使用してカーソルを表示するのは不適切)
SQL> var rc refcursor;
SQL> declare
2 v_select_all_cols boolean := true; --set as applicable.
3 begin
4
5 if (v_select_all_cols)
6 then
7 open :rc for select a,b,c from t1;
8 else
9 open :rc for select a,b from t1;
10 end if;
11 end;
12 /
PL/SQL procedure successfully completed.
SQL> print rc
A B C
---------- ---------- ----------
1 2 3
SQL> declare
2 v_select_all_cols boolean := false;
3 begin
4
5 if (v_select_all_cols)
6 then
7 open :rc for select a,b,c from t1;
8 else
9 open :rc for select a,b from t1;
10 end if;
11 end;
12 /
PL/SQL procedure successfully completed.
SQL> print rc
A B
---------- ----------
1 2
あなたの場合、すぐに実行するplsqlは良い決定です。ただし、データのみが必要な場合は、次のように試すことができます。役立つ場合があります。
SELECT a,
CASE
WHEN (condition) THEN
b
ELSE
nvl(b, '') || ';' || nvl(c, '')
END AS NEW_COL
FROM t1