【问题标题】:Execute select statement within an IF clause Oracle在 IF 子句 Oracle 中执行 select 语句
【发布时间】:2021-04-21 03:03:53
【问题描述】:

这是来自 SQL Server 的查询,我想问的是,我想在 Oracle 中如何获得相同的结果,查询会是什么?

我需要这样的结果:'这是 SQL Server 上的查询'

declare @a int = 6

if @a = 1
begin
    select * 
    from table_A
end
else
begin
    select * 
    from table_B
end

我在 oracle 上试过这样但失败了

    declare 
    type FF_rec is record(
        st_Value number
        );
        var_ff FF_rec;
begin
var_ff.st_Value:=1;
    if 1<=0 then
    select * from Table_A;
    else
    select * from Table_B;
    end if;
end;
    

【问题讨论】:

  • 我添加了一张图片,我尝试过但失败了,我只需要在某些条件下选择不同的结果。
  • Table_ATable_B 的结构相同,还是它们不同?
  • 两个表的结构不同

标签: sql-server oracle if-statement select plsql


【解决方案1】:

如果它必须在 SQL 级别,那么也许您可以使用这样的代码:根据传递给 PAR_WHAT 替换变量的值,您将从 EMPDEPT 表。

由于UNION set 运算符,选择列列表必须在数字和数据类型上匹配, 即

  • 您不能选择例如第一个选择的两列和第二个选择的 5 列;
  • 它们也不能在数据类型上不匹配,例如第一次选择的第一列是DATE,而第二次选择的第一列是NUMBER

所以:

SQL> select empno, ename, job
  2  from emp
  3  where &&par_what = 1
  4  union
  5  select deptno, dname, loc
  6  from dept
  7  where &&par_what = 2;
Enter value for par_what: 1

     EMPNO ENAME          JOB
---------- -------------- -------------
      7369 SMITH          CLERK
      7499 ALLEN          SALESMAN
      7521 WARD           SALESMAN
      7566 JONES          MANAGER
      7654 MARTIN         SALESMAN
      <snip>

14 rows selected.

SQL> undefine par_what
SQL> /
Enter value for par_what: 2

     EMPNO ENAME          JOB
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL>

如果您对 PL/SQL 没问题,那么一种选择是创建一个返回 refcursor 的函数。哪一个?取决于您传递给它的参数:

SQL> create or replace function f_test (par_what in number)
  2    return sys_refcursor
  3  is
  4    l_rc sys_refcursor;
  5  begin
  6    if par_what = 1 then
  7       open l_rc for select deptno, ename, job, sal, hiredate from emp;
  8    elsif par_what = 2 then
  9       open l_rc for select deptno, dname, loc from dept;
 10    end if;
 11
 12    return l_rc;
 13  end;
 14  /

Function created.

测试:

SQL> select f_test(1) from dual;

F_TEST(1)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

    DEPTNO ENAME      JOB              SAL HIREDATE
---------- ---------- --------- ---------- ----------
        20 SMITH      CLERK            800 17.12.1980
        30 ALLEN      SALESMAN        1600 20.02.1981
        30 WARD       SALESMAN        1250 22.02.1981
        20 JONES      MANAGER         2975 02.04.1981
        30 MARTIN     SALESMAN        1250 28.09.1981
        30 BLAKE      MANAGER         2850 01.05.1981
<snip>

14 rows selected.


SQL> select f_test(2) from dual;

F_TEST(2)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON


SQL>

【讨论】:

  • 对于第一个示例,我在哪里输入值 &&par_what
  • 我使用了 SQL*Plus,所以我在 SQL 提示符下输入了它。这取决于你使用什么作为工具。也许您必须将其重写为例如where :par_what = 1(用冒号代替 &&)。
  • 对不起,我还是对第一个例子感到困惑,你能解释一下我如何执行查询并输入值:par_what
  • 您使用哪个工具来访问您的 Oracle 数据库?
  • Oracle SQL Developer 版本 19.2.1.247
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多