SQL语句返回null而不是空

时间:2015-07-21 17:54:49

标签: mysql

我有一个SQL查询:

SELECT Player, 
Avg(Case When Score1> 0 then Score1 end) AS AverageScore1, 
Avg(Case When Score2> 0 then Score2 end) AS AverageScore2
FROM scores 
WHERE .... various criteria ...

问题是,当设置标准时,这将导致单个空记录的集合,因此不应包括任何分数/玩家。

有没有办法避免获取空记录而结果是空的而不是像这个例子一样?

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以围绕列包装ISNULL函数。

ISNULL(Avg(Case When Score1> 0 then Score1 end),'')

如果第一个参数返回NULL值,它将被第二个参数替换。

答案 1 :(得分:0)

处理数值时,没有“空”这样的东西。你最接近的是NULL,这是你的表达式返回的。

如果您想要NULL值,则应将值显式转换为字符串。这对于格式化原因很重要。您没有指定您正在使用的数据库;大多数数据库都有一种格式化数字的方法。

这个想法是这样的:

SELECT Player, 
       COALESCE(CAST(Avg(Case When Score1 > 0 then Score1 end) as VARCHAR(255)), '') AS AverageScore1, 
       COALESCE(CAST(Avg(Case When Score2 > 0 then Score2 end) as VARCHAR(255)), '') AS AverageScore2
FROM scores 
WHERE .... various criteria ...
GROUP BY Player;

cast()只是一个占位符,用于输出字符串的首选方法,如果您决定沿着此路线前进。

答案 2 :(得分:0)

所以你的表设置类似于:

create table scores(
  Player varchar(20) not null,
  score1 int not null,
  score2 int not null
);

您的数据与此类似:

insert into scores(player, score1, score2) values('player 1', 0, 0);
insert into scores(player, score1, score2) values('player 1', 10, 20);
insert into scores(player, score1, score2) values('player 1', 20, 30);

当您使用与此类似的条件运行查询时:

SELECT Player, 
    Avg(Case When Score1> 0 then Score1 end) AS AverageScore1, 
    Avg(Case When Score2> 0 then Score2 end) AS AverageScore2
FROM scores
where Score1<10 and Score2<10
GROUP BY Player

你得到这样的输出:

Player     AverageScore1    AverageScore2
---------  ---------------  -----------------
Player1    NULL             NULL

但你想要的是:

Player     AverageScore1    AverageScore2
---------  ---------------  -----------------

是吗?

如果是这样,添加“HAVING”子句将使用NULLS过滤掉记录:

SELECT Player, 
    Avg(Case When Score1> 0 then Score1 end) AS AverageScore1, 
    Avg(Case When Score2> 0 then Score2 end) AS AverageScore2
FROM scores
where Score1<10 and Score2<10
GROUP BY Player
having Avg(Case When Score1> 0 then Score1 end) is not null and
    Avg(Case When Score2> 0 then Score2 end) is not null