在Oracle sql developer中使用Select语句的If Else
我想知道是否可以编写一个sql查询,根据条件返回一组列 例如:在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
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;