if-then-else逻辑决定运行哪个select语句

时间:2015-09-28 15:09:06

标签: sql oracle

我正在编写一些脚本,我正在试图弄清楚如何添加正确的逻辑,以便根据传入的变量是什么(我将使用x作为示例),将运行两个select语句。这是我正在寻找的一个简单例子:

两个select语句选项 X等于“1”或“2”

如果X等于1,则运行“select * from table,其中y = 3且z = 4;”

如果X等于2则运行“select * from table,其中y = 3且z = 5且q = 6且r = 12;”

这两个陈述的where子句不同的事实导致了我的问题,因为它使得我通常会做CASE陈述变得更加困难。

我想到的第一件事就是做一些类似于from子句中的case语句的东西,这样我就可以做类似的事情:

    select * from 
    (
    case when x=1 then (select 1 from dual)
    case when x=2 then (select 2 from dual)
    )

但我知道这不起作用,无论如何我都不确定将这种逻辑添加到from子句中。

总而言之,我正在尝试运行两个可能的查询之一,具体取决于传递给SQL的变量的值,但是这两个查询具有不同的where子句,这使得更难在其中使用case语句where子句。我很感激有关如何解决这个问题的任何意见或建议。

感谢先进的人!

4 个答案:

答案 0 :(得分:2)

使用简单的OR

SELECT *
FROM your_table
WHERE (:X = 1 AND y=3 AND z=4)
   OR (:X = 2 AND y=3 and z=5 and q=6 and r=12);

答案 1 :(得分:2)

我的建议不一定是最有效的方法,特别是在你的情况下,因为你有一个相对简单的任务。但是,值得一提的是,对于这种情况,甚至更复杂的情况,你总是可以写一个程序:

drop procedure if exists optionalClause;
CREATE PROCEDURE optionalClause()
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `optionalClause`()
begin
    DECLARE x INT DEFAULT 0;
    /* determining the value of x, for example using select into statement*/

    if @x=1 then
        /* select statement 1 */
    end if;

    if @x=2 then
        /* select statement 2 */
    end if;

END;
$$ DELIMITER ;
CALL optionalClause();

当然你可以使用else语句而不是两个单独的if语句,并使它像你想要的那样复杂。祝你好运!

答案 2 :(得分:1)

你可以尝试沿着这些行,用select语句中的正确整数替换变量。

declare @x int = 2

if @x = 1 goto No1
if @x = 2 goto No2

No1:

print ('This is x = 1')
select * from table where y=3 and z=4;

goto TheEnd

No2:

print ('This is x = 2')
select * from table where y=3 and z=5 and q=6 and r=12;

goto TheEnd

TheEnd:

Print('you made it')

答案 3 :(得分:0)

CASE将在SELECT语句中为您提供IF-THEN逻辑。例如:

SELECT CASE WHEN x=1 THEN field1 ELSE field2 END AS [Conditional Field]
FROM tablename;

或者,您可以使用IF-THEN-ELSE运行一个或另一个语句。例如: