我有以下代码:
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值,这是可能的吗?我知道这可能不是最好的做法,但我正在使用继承的代码,这可能是最简单和最快的解决方案。
一如既往的感谢,
H.
发布于 2012-07-24 19:21:41
创建一个只有一行的表。然后,您可以使用left join来获得所需的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。
发布于 2012-07-24 20:04:23
您可以结合使用UNION和LIMIT来提供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可以用来做实验。
发布于 2012-07-24 18:50:05
coalesce()函数可用于从多个逗号分隔的列或字符串中返回第一个非空值。值/列的计算值是从左到右的,因此,如果您希望将字符串弹出到非null的参数中,请确保将其放在测试所针对的列的右侧。
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。
https://stackoverflow.com/questions/11629211
复制相似问题