我正在编写一些脚本,我正在试图弄清楚如何添加正确的逻辑,以便根据传入的变量是什么(我将使用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子句。我很感激有关如何解决这个问题的任何意见或建议。
感谢先进的人!
答案 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运行一个或另一个语句。例如: