0

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 ;
4

3 に答える 3

1

あなたが何をしようとしているのかははっきりしていません。

このクエリの結果だけに興味がある場合は、これを行うことはできません。不明な数の列を返すクエリを使用することはできません。次のように、条件が満たされない限り、3 つの列と 1 つの列を null にすることができます。

SELECT a, CASE WHEN ( condition ) THEN b ELSE NULL END AS b, c
  FROM t1

あなたの目標が実際にテーブルを作成することである場合 (ただし、このようなテーブル作成を行うことは強くお勧めしません)、 を使用できますEXECUTE IMMEDIATE string。 where stringis 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;
于 2013-01-15T01:20:49.737 に答える
0

つまり、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 を使用した簡単なテスト ( varpl/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
于 2013-01-15T08:13:30.653 に答える
0

あなたの場合、すぐに実行するplsqlは良い決定です。ただし、データのみが必要な場合は、次のように試すことができます。役立つ場合があります。

SELECT a,
       CASE
         WHEN (condition) THEN
          b
         ELSE
          nvl(b, '') || ';' || nvl(c, '')
       END AS NEW_COL
  FROM t1
于 2013-01-15T03:58:13.187 に答える