Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle sql developer中使用Select语句的If Else_Sql_Oracle - Fatal编程技术网

在Oracle sql developer中使用Select语句的If Else

在Oracle sql developer中使用Select语句的If Else,sql,oracle,Sql,Oracle,我想知道是否可以编写一个sql查询,根据条件返回一组列 例如: If (id=='A') { Select id,name From Table A } Else If(Condition=B) { Select Column1, Column3 From Table A } 如果是,请帮助我编写语法(If-THEN-ELSE) Oracle/PLSQL中IF-THEN-ELSE的语法为: IF condition THEN {...statements

我想知道是否可以编写一个sql查询,根据条件返回一组列

例如:

If (id=='A')
{
    Select id,name
    From Table A
}
Else If(Condition=B)
{
    Select Column1, Column3
    From Table A
}
如果是,请帮助我编写语法(If-THEN-ELSE)

Oracle/PLSQL中IF-THEN-ELSE的语法为:

IF condition THEN
   {...statements to execute when condition is TRUE...}

ELSE
   {...statements to execute when condition is FALSE...}

END IF;

您可以使用普通SQL中的
CASE
表达式执行类似switch的语句。见下文:


当然也有一些局限性。例如,THEN子句中返回值的类型需要匹配,所以您可能需要将例如all转换为char或int等。

SQL本身不是图灵完整的,它没有循环和条件的语法:您可以使用它执行查询,无论它有多复杂,但是,您不能根据条件决定执行哪个查询,也不能多次执行查询,这正是您在这里要做的

为了提供这种功能,每个数据库开发人员通常会提供一种额外的语言,包括变量声明、循环、条件等。对于Oracle,这种语言是PL/SQL

在SQL Developer中,要解决您的问题并了解PL/SQL的工作原理,您需要做的是创建一个空脚本,然后编写如下内容:

--Enabling output to the console
SET SERVEROUTPUT ON;
DECLARE
--Variable declaration block; can initialize variables here too
    test_var varchar2(10);
    test_result varchar2(10);
BEGIN
--Initializing variables, the first one we will check in the IF statement, the second one is just for transparency
    test_var := 'test';
    test_result := '';

--IF block: check some condition, perform a select based on the value, save result into a variable
    IF test_var = 'test' THEN
        SELECT '1' INTO test_result FROM dual;
    ELSE
        SELECT '2' INTO test_result FROM dual;
    END IF;

--Output the result to console
    DBMS_OUTPUT.PUT_LINE(test_result);

END;
然后使用“运行脚本”/F5运行它。您将获得预期的“1”作为输出。将test_var更改为其他内容并再次运行,您将得到“2”

如果您有这类问题,那么了解SQL和PL/SQL到底是什么可能会很有用。PL/SQL非常高效和通用,可以用于从自动化SQL脚本到实现复杂优化算法的任何事情


当然,PL/SQL对于for和WHILE循环、大小写检查等都有类似的结构。

我想这就是您所看到的

即使使用CASE和DECODE,在SQL中也不可能进行这样的选择

但我们能做的最好的事情是创建一个返回ref_游标的函数,并在SQL语句中使用该函数来满足您的需求

下面是一个例子:

CREATE OR REPLACE
  FUNCTION test1(
      id1 VARCHAR)
    RETURN sys_refcursor
  AS
    v_ref sys_refcursor;
  BEGIN
    IF(id1='A') THEN
      OPEN v_ref FOR SELECT id,name FROM TABLE A;
    ElsIf(id1='B') THEN
      OPEN v_ref FOR SELECT Column1, Column3 FROM TABLE A;
    END IF;
    RETURN v_ref;
  END;

select test1(A) from dual;

上面将只显示列id和名称。

否这在SQL中是不可能的,您需要使用PL/SQL(可能还有动态SQL)。您比较的
id
的值来自哪里?
CREATE OR REPLACE
  FUNCTION test1(
      id1 VARCHAR)
    RETURN sys_refcursor
  AS
    v_ref sys_refcursor;
  BEGIN
    IF(id1='A') THEN
      OPEN v_ref FOR SELECT id,name FROM TABLE A;
    ElsIf(id1='B') THEN
      OPEN v_ref FOR SELECT Column1, Column3 FROM TABLE A;
    END IF;
    RETURN v_ref;
  END;

select test1(A) from dual;