oracle选择要显示的列

时间:2013-01-14 22:29:58

标签: sql oracle

我试图在ORACLE中创建一个SELECT。 我正在从一个表中选择3列 我想做一个测试(其他选择的结果) 如果它是真的显示所有列 如果错误只显示两个。

create table t1(a int ,b int , c int) ;
    select a ,  case when (1=1) then (b ,c)
        else (b) end;
from t1 ;

3 个答案:

答案 0 :(得分:1)

目前还不清楚你要做什么。

如果您只对此查询的结果感兴趣,则无法执行此操作。您不能拥有返回未知列数的查询。除非满足条件,否则可以有三列,一列为空,如:

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

如果您的目标是实际创建一个表(但我建议强烈反对像这样创建表),您可以使用EXECUTE IMMEDIATE string,其中string是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;

答案 1 :(得分:0)

在你的情况下,使用execute immediate的plsql是很好的decigin。但是,如果您只想要这样的数据,可能会对您有所帮助:

SELECT a,
       CASE
         WHEN (condition) THEN
          b
         ELSE
          nvl(b, '') || ';' || nvl(c, '')
       END AS NEW_COL
  FROM t1

答案 2 :(得分: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进行快速测试(使用var来打印游标而不是pl / sql变量)

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