4

我有以下代码:

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。

4

3 回答 3

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中没有条件,可以用.WHEREON 1any row matches

于 2012-07-24T11:21:41.483 回答
2

您可以将 a 与 aUNION结合使用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;

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

有一个小提琴可以试验。

于 2012-07-24T12:04:23.020 回答
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作为一行返回。

于 2012-07-24T10:50:05.420 回答