首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -查询返回NULL

问MySQL -查询返回NULL
EN

Stack Overflow用户
提问于 2012-07-24 18:46:39
回答 3查看 1.6K关注 0票数 4

我有以下代码:

代码语言:javascript
复制
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将返回以下消息(这是非常正确的):

代码语言:javascript
复制
MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0178 sec )

然而,我想要的是返回一个NULL值,这是可能的吗?我知道这可能不是最好的做法,但我正在使用继承的代码,这可能是最简单和最快的解决方案。

一如既往的感谢,

H.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-24 19:21:41

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2012-07-24 20:04:23

您可以结合使用UNION和LIMIT来提供NULL值:

代码语言:javascript
复制
(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
EN

Stack Overflow用户

发布于 2012-07-24 18:50:05

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

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11629211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档