Sql If-then-else逻辑决定运行哪个select语句
我正在编写一些脚本,并试图找出如何添加适当的逻辑,以便根据传入的变量(我将使用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语句,这样我就可以做一些事情,比如: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子句
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数据库的。