我想知道是否可以编写一个基于条件返回一组列的SQL查询。
例如:
If (id=='A')
{
Select id,name
From Table A
}
Else If(Condition=B)
{
Select Column1, Column3
From Table A
}
如果是,请帮我写一下
答案 0 :(得分:1)
语法(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;
答案 1 :(得分:1)
您可以在纯SQL中使用CASE
表达式执行类似switch的语句。请参阅以下example:
SELECT some_other_field,
id,
CASE ID
WHEN A THEN columnA
WHEN B THEN columnB
ELSE 'Unknown'
END genericvalue
FROM customers;
当然有一些限制。例如,THEN子句中返回值的类型需要匹配,因此您可能需要将例如all转换为char,或转换为int等。
答案 2 :(得分:1)
SQL本身不是turing-complete,它没有循环和条件的语法:你可以使用它执行查询,无论它有多复杂,但你无法决定执行哪个查询取决于条件或执行多次查询,这是你在这里要做的。
为了提供这样的功能,每个数据库开发人员通常都提供一种包含变量声明,循环,条件等的附加语言。对于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;
然后使用'Run script'/ F5运行它。你会得到'1'作为你想象的输出。将test_var更改为其他内容并再次运行,您将获得“2”。
如果您有这类问题,那么了解SQL和PL / SQL究竟是什么可能会有用。 PL / SQL非常高效和通用,可用于从自动化SQL脚本到实现复杂优化算法的任何事情。
当然,PL / SQL具有类似FOR和WHILE循环,CASE检查等的结构。
答案 3 :(得分:0)
我想这就是你在看的东西。
即使使用CASE和DECODE,也无法在SQL中进行此类选择。
但我们能做的最好的事情是我们可以创建一个返回ref_cursor的函数,并使用SQL stetement中的函数来满足您的需求。
下面是一个例子:
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和名称。