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 逻辑吗? [复制]