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

Posted

技术标签:

【中文标题】If-then-else 逻辑来决定运行哪个 select 语句【英文标题】:If-then-else logic to decide which select statement to run 【发布时间】:2015-09-28 15:09:05 【问题描述】:

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

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

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

如果 X 等于 2,则运行“select * from table where y=3 and z=5 and q=6 and 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 子句,这使得在where 子句。对于如何解决此问题的任何意见或建议,我将不胜感激。

感谢各位高手!

【问题讨论】:

是否需要从同一张表中选择不同的 WHERE 条件? 是的,两条语句都是从同一张表中选择的,where条件不同(where条件也不同长度) 【参考方案1】:

使用简单的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);

【讨论】:

我应该更清楚一点,变量 X 不在“your_table”中,它是从 unix 脚本传入 sql 脚本的变量。因此,根据传入的 X 值(两种可能性),我想运行两个不同查询之一。 @corn503 但 X 是可变的,请参阅 :X,它是独占的,因此它以一个路径 1 或 2 结束 啊,我稍微误读了你的答案。谢谢,这很适合我正在尝试做的事情 @corn503 如果对您有帮助,请考虑标记为答案meta.stackexchange.com/a/5235 :)【参考方案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 语句,并使其变得尽可能复杂。祝你好运!

【讨论】:

那是什么数据库引擎? OP 要求使用 Oracle,这看起来不像 PL/SQL。 @ 变量通常是 SQL Server,但也不是 SQL Server。 @ShannonSeverance。你是对的!它是 mysql。顺便说一句,他没有在问题中提及任何内容。 问题标记为[oracle],是针对Oracle数据库的。【参考方案3】:

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

【讨论】:

是的,我觉得这很简单,您可以将代码分割成整齐的包。 一开始很容易阅读,但你最终会得到不可维护的代码:) Spaghetti_code【参考方案4】:

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

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

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

【讨论】:

我猜THEN 错过了。 修正了我还有其他地方的错字。 docs.oracle.com/cd/B19306_01/server.102/b14200/…

以上是关于If-then-else 逻辑来决定运行哪个 select 语句的主要内容,如果未能解决你的问题,请参考以下文章

可以在 Redshift 中完成 if-then-else 逻辑吗?

oracle 菜鸟学习之 decode中if-then-else逻辑

您可以在 SQL 中使用 if-then-else 逻辑吗? [复制]

if-then-else 结构中的注释应该放在哪里? [关闭]

Twig 三元运算符,简写 if-then-else

kafka 如何决定单个消费者组中哪个消费者读取消息?