MySQL函数,必须带回一行

时间:2012-02-14 15:11:15

标签: mysql null

我有这个简单的MySQL声明:

 SELECT 
   ((AVG(q1) + AVG(q8) + AVG(q15)) / 3 ) AS Res  
 FROM tresults 
 WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1'
 GROUP BY q25

现在,如果没有日期 MARCH2010 的行,那么查询返回零结果(这是正确的)但我希望它返回一行 - 即使结果是 NULL

3 个答案:

答案 0 :(得分:1)

您只需选择一行作为常量,然后将left join选择为结果集:

select l.*, r.* 
from (select "your constant" as constant) as l 
left join ( 
  SELECT 
     ((AVG(q1) + AVG(q8) + AVG(q15)) / 3 ) AS Res  
   FROM tresults 
   WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1'
   GROUP BY q25
) as r on 1

这是如何运作的:

  • select "your constant" as constant始终返回单行
  • left join始终至少返回left表中的所有行
  • 如果right表没有行,则整个left表扩展为一堆空列,结果有一行
  • 如果right表有n行,则结果有n行,每行都有一个额外的“常量”列

答案 1 :(得分:0)

我不是绝对肯定的,但这个案例陈述可能有效。我无法测试它。

Case When 
  (SELECT 
   Count(*)  
   FROM tresults 
   WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1'
   GROUP BY q25) > 0
Then
  SELECT 
   ((AVG(q1) + AVG(q8) + AVG(q15)) / 3 ) AS Res  
   FROM tresults 
   WHERE id = '1' AND date = 'MARCH2010' AND q25 = '1'
   GROUP BY q25
Else
  SELECT null
End

答案 2 :(得分:0)

选择    ((AVG(q1)+ AVG(q8)+ AVG(q15))/ 3)AS Res
 从结果来看  WHERE id ='1'AND date ='MARCH2010'AND q25 ='1'  GROUP BY q25

UNION ALL

SELECT NULL AS Res 来自双重 什么地方没有(     选择    ((AVG(q1)+ AVG(q8)+ AVG(q15))/ 3)AS Res
 从结果来看  WHERE id ='1'AND date ='MARCH2010'AND q25 ='1'  GROUP BY q25 )

总是会返回第二部分的一行。