MySQL - 查询返回NULL

时间:2012-07-24 10:46:39

标签: mysql sql null

我有以下代码:

SELECT q25, (
(
AVG( q1 ) + AVG( q2 ) + AVG( q3 ) ) /3 ) AS Overall
FROM t_results
WHERE brand =  'XYZ'
AND DATE =  'MAY2012'
GROUP BY q25
ORDER BY Overall 
DESC LIMIT 1

如果查询中找不到数据,phpmyadmin会返回以下消息(这是完全正确的):

MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0178 sec )

但是,我想要的是实际返回NULL值,这可能吗?我感谢这可能不是最佳实践,但我正在使用继承的代码,这可能是解决方案的简单和最快捷的途径。

一如既往地谢谢,

小时。

3 个答案:

答案 0 :(得分:3)

创建一个只有一行的表。然后,您可以使用左连接来获得所需的NULL结果。

CREATE TABLE dummy (d TINYINT NOT NULL);
INSERT INTO dummy SET d = 1;

SELECT q25,
       ( ( AVG( q1 ) + AVG( q2 ) + AVG( q3 ) ) /3 ) AS Overall
FROM dummy LEFT JOIN t_results
  ON brand = 'XYZ'
 AND DATE = 'MAY2012'
GROUP BY q25
ORDER BY Overall DESC
LIMIT 1

您还可以使用子查询替换虚拟表:

SELECT q25,
       ( ( AVG( q1 ) + AVG( q2 ) + AVG( q3 ) ) /3 ) AS Overall
FROM (SELECT 1) AS dummy LEFT JOIN t_results
  ON brand =  'XYZ'
 AND DATE =  'MAY2012'
GROUP BY q25
ORDER BY Overall DESC
LIMIT 1

通过sqlfiddle对此进行测试,您还可以在其中试验替代方案。

选择结果的条件(以前在WHERE子句中)现在必须进入ON子句。否则,左连接将生成非NULL行,WHERE将删除这些行,而不是在找不到匹配行时生成单个NULL行。如果原始查询中没有WHERE条件,ON 1可用于表达any row matches

答案 1 :(得分:2)

您可以使用UNIONLIMIT相结合来提供NULL值:

(SELECT q25,
        (AVG(q1) + AVG(q2) + AVG(q3))/3 AS Overall
 FROM t_results
 WHERE brand = 'XYZ'
 AND DATE = 'MAY2012'
 GROUP BY q25
 ORDER BY Overall DESC
 LIMIT 1
)
UNION ALL
(SELECT NULL, NULL)
LIMIT 1;

这仅在您知道第一个查询永远不会产生多个结果时才有效。这就是这种情况,所以这可能是最适合您的解决方案,但我other answer中给出的方法更为通用。

有一个fiddle可供试验。

答案 2 :(得分:0)

coalesce()函数可用于从多个逗号分隔的列或字符串返回第一个非空值。值/列从左到右计算,因此如果要将字符串弹出到非空的参数中,请确保将其放在要测试的列的右侧。

select
    coalesce(
    (
    SELECT
        q25
    FROM 
        t_results
    WHERE 
        brand =  'XYZ'
        AND DATE =  'MAY2012'
    GROUP BY 
        q25
    LIMIT 1
    ), 'null') as q25,
    coalesce(
    (
    SELECT 
        ((AVG( q1 ) + AVG( q2 ) + AVG( q3 ) ) /3 ) AS Overall
    FROM t_results
    WHERE 
        brand =  'XYZ'
        AND DATE =  'MAY2012'
    LIMIT 1
    ), 'null') as Overall
from 
    t_results
group by 
    1, 2;

如果您没有与where子句匹配的数据,则会将null, null作为一行返回。