让我说我有一些基本的东西
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)
但有没有办法不重复查询,因为它很长,我不希望服务器执行两次相同的查询?
答案 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更强大,特别是在处理递归关系时。