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

Sql If-then-else逻辑决定运行哪个select语句,sql,oracle,Sql,Oracle,我正在编写一些脚本,并试图找出如何添加适当的逻辑,以便根据传入的变量(我将使用x作为示例)运行两个select语句中的一个。下面是一个简单的例子,说明我在寻找什么: 两个select语句选项 X等于“1”或“2” 如果X等于1,则运行“从y=3和z=4的表格中选择*” 如果X等于2,则运行“从表中选择*,其中y=3,z=5,q=6,r=12;” 事实上,where条款对于这两个陈述是不同的,这给我带来了问题,因为这使得我很难像平时那样做一个案例陈述 我想到的第一件事是做一些事情,比如from子句

我正在编写一些脚本,并试图找出如何添加适当的逻辑,以便根据传入的变量(我将使用x作为示例)运行两个select语句中的一个。下面是一个简单的例子,说明我在寻找什么:

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

如果X等于1,则运行“从y=3和z=4的表格中选择*”

如果X等于2,则运行“从表中选择*,其中y=3,z=5,q=6,r=12;”

事实上,where条款对于这两个陈述是不同的,这给我带来了问题,因为这使得我很难像平时那样做一个案例陈述

我想到的第一件事是做一些事情,比如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子句,这使得where子句中更难包含case语句。如果您能就如何解决这个问题提供任何意见或建议,我将不胜感激


感谢先进的家伙

使用简单的

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);

使用简单的

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);

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

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

或者,您可以使用来运行一条或另一条语句。例如:

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

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

或者,您可以使用来运行一条或另一条语句。例如:

您可以尝试以下方法,用select语句中正确的整数替换变量

SELECT CASE WHEN x=1 THEN field1 ELSE field2 END AS [Conditional Field]
FROM tablename;
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')

您可以尝试以下方法,用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')

我的建议不一定是最有效的方法,尤其是在你的情况下,因为你心里有一个相对简单的任务。但是,值得一提的是,对于这种情况以及更复杂的情况,您始终可以编写一个过程:

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语句,并使其尽可能复杂。祝你好运

我的建议不一定是最有效的方法,尤其是在你的情况下,因为你心里有一个相对简单的任务。但是,值得一提的是,对于这种情况以及更复杂的情况,您始终可以编写一个过程:

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语句,并使其尽可能复杂。祝你好运

是否需要从具有不同WHERE条件的同一表中选择?是的,这两条语句从具有不同WHERE条件的同一表中选择(WHERE条件的长度也不同)是否需要从具有不同WHERE条件的同一表中选择?是的,这两条语句从同一表中选择,对于不同的where条件(where条件的长度也不同),我应该更清楚,变量X不在“your_table”中,它是从unix脚本传入sql脚本的变量。因此,根据传入的X值(共有2种可能),我想运行两个不同查询中的一个。@corn503但X是可变的,请参见
:X
,它是独占的,因此以一个路径1或2ah结束,我稍微误读了您的答案。谢谢,这对我想要的很有效do@corn503如果它帮助你,考虑标记为答案:)我应该更清楚,变量X不在“You-Type表”中,它是从UNIX脚本传递到SQL脚本的变量。因此,根据传入的X值(共有2种可能),我想运行两个不同查询中的一个。@corn503但X是可变的,请参见
:X
,它是独占的,因此以一个路径1或2ah结束,我稍微误读了您的答案。谢谢,这对我想要的很有效do@corn503如果它对你有帮助,请考虑标记为答案:“我猜<代码>然后<代码>是错误的。我猜
然后
被遗漏了。修复了我其他地方的打字错误。是的,我发现它简单易懂,你可以把你的代码分割成整齐的代码包。一开始很容易阅读,最后你会得到不可维护的代码:)是的,我发现它简单易懂,你可以把你的代码分割成整齐的代码包。一开始很容易阅读,最后你会得到不可维护的代码:)这是什么DB引擎?OP要求的是Oracle,这看起来不像PL/SQL变量通常是SQL Server,但也不是SQL Server。@ShannonSeverance。你说得对!它是MySQL。顺便说一句,他在问题中没有提到任何东西。问题被标记为[oracle],这是针对oracle数据库的。这是用于什么数据库引擎的?OP要求的是Oracle,这看起来不像PL/SQL变量通常是SQL Server,但也不是SQL Server。@ShannonSeverance。你说得对!它是MySQL。顺便说一句,他没有在问题中提到任何东西。问题被标记为[oracle],这是针对oracle数据库的。