当有case when子句时,max函数没有

时间:2018-10-26 07:38:23

标签: sql hive

我有两个表。 一个如下所示

表a

ID, count
1,  123
2,  123
3,  123

表b

ID, count

表b为空

使用时

 
SELECT CASE
    WHEN isnotnull(max(b.count)) THEN max(a.count) + max(b.count)
    ELSE max(a.count)
FROM a, b

唯一的结果总是NULL 我很困扰。为什么?

4 个答案:

答案 0 :(得分:1)

由于表b为空,因此max(b.count)将返回NULL。使用NULL进行的任何操作都将产生NULL

因此,max(a.count) + max(b.count)为NULL。(this is 123 + NULL which will be NULL always)。因此,您的查询返回的是NULL。

只要出现NULL,只要使用coalesce来分配默认值即可。

答案 1 :(得分:1)

使用coalesce()函数和显式联接,避免用逗号分隔的表名类型为旧联接方法

  select coalesce(max(a.count)+max(b.count),max(a.count))
  from a left join b on a.id=b.id

答案 2 :(得分:1)

您不需要使用JOIN,两个子查询中的简单SUM即可为您提供所需的结果。由于您只在非MAX(b.count)时添加NULL,因此我们可以一直将其添加,但在COALESCE时将NULL添加为0。

SELECT COALESCE((SELECT MAX(count) FROM b), 0) + (SELECT MAX(count) FROM a)

完成此工作的另一种方法是从每个表中UNIONcount值:

SELECT COALESCE(MAX(bcount), 0) + MAX(acount)
FROM (SELECT count AS acount, NULL AS bcount FROM a
      UNION
      SELECT NULL AS acount, count AS bcount FROM b) u

请注意,如果您使用JOIN,则必须。如果使用FULL JOIN,则可能会看不到表b中的所有值。例如,考虑表b具有一个条目:LEFT JOIN的情况。 ID=4, count=456上的LEFT JOIN不会在结果表中包含此值(因为表a的ID值分别为1,2和3),所以您将得到错误的结果:

ID

输出

CREATE TABLE a (ID INT, count INT);
INSERT INTO a VALUES (1, 123), (2, 123), (3, 123);
CREATE TABLE b (ID INT, count INT);
INSERT INTO b VALUES (4, 456);
SELECT COALESCE(MAX(b.count), 0) + MAX(a.count)
FROM a
LEFT JOIN b ON a.ID = b.ID

要使用123 (should be 579) ,请写

FULL JOIN

答案 3 :(得分:0)

使用左联接

SELECT coalesce(max(a.count) + max(b.count),max(a.count))
   FROM a left join b a.id=b.id