MySQL如果满足条件则返回查询结果,而不重复查询

时间:2013-08-08 13:49:52

标签: mysql if-statement

让我说我有一些基本的东西

SELECT IF( (1 + 2) >=0, (1 + 2), 0)
FROM DUAL

显然会返回3.

有没有办法不重复我想要返回的查询(这里是1 + 2)?

为了放入上下文,我想返回当前剩余的任务数量(必须至少完成4个),但是如果已经完成了4个以上,则不需要做更多,所以我想要返回0。

我所做的是

IF((4 - IFNULL((LONG QUERY RETURNING THE NUMBER OF TASKS DONE THIS MONTH FOR A PARTICULAR USER ),0)) >= 0,
(4 - IFNULL((LONG QUERY RETURNING THE NUMBER OF TASKS DONE THIS MONTH FOR A PARTICULAR USER ), 
0)

但有没有办法不重复查询,因为它很长,我不希望服务器执行两次相同的查询?

3 个答案:

答案 0 :(得分:4)

根据您的要求,您可能希望使用user-defined variables

SELECT 1+2 INTO @tmp;
SELECT IF( @tmp >=0, @tmp, 0)

或者如果您喜欢一个衬垫

SELECT IF( (@tmp := (1+2)) >=0, @tmp, 0)
--         ^             ^
--        don't forget those parenthesis !

编辑:这也适用于“表格选择”语句:

CREATE TABLE tbl AS SELECT 1 as a UNION SELECT 2;
SELECT SUM(a) FROM tbl INTO @tmp;
SELECT IF ( @tmp > 0, @tmp, 0);

如果您查看http://sqlfiddle.com/#!2/37c33/1上述查询的执行计划,您会看到第二个SELECT不使用该表。


顺便说一句,请注意,根据您的实际示例,可能已写入:

SELECT MAX( (1+2), 0 )
--          ^^^^^ here your expression

...但我认为

答案 1 :(得分:2)

你可以这样做:

SELECT IF( (@a:=(1 + 2)) >=0, @a, 0);

答案 2 :(得分:1)

一个声明解决方案

在MySQL中解决此问题的一种方法是保存繁重查询的输出并多次重用。看看这里:

SELECT CASE 
  WHEN @Value - 4 > 0 
  THEN @Value ELSE 0 
  END
FROM (SELECT @Value := (SELECT 1)) Query

其中«SELECT 1»应该被您的查询替换。

<强> OT

执行查询的另一种方法是需要CTE(公用表表达式)的支持。

据我所知,MySQL(How to transform a MSSQL CTE query to MySQL?

中缺少此功能

只是为了让你体验一下MSSQL中的表现力,CTE可用,你可以这样写:

with Query (value) 
as
(
    select 1
 )
select 
  case
    when (select value from Query) - 4 > 0
      then (select value from Query)
    else
      0
  end

事实上,CTE更强大,特别是在处理递归关系时。