如何使聚合查询 return 为空集而不是 NULL 行?

How do I make aggregate query return empty set instead of NULL row?

我有一个这样的 SQL 查询:

SELECT t1.name, MAX(t2.value)
FROM t2
JOIN t1 ON t1.id = t2.t1_id
WHERE t2.t1_id = 1 AND t2.text_id = 16;

然而,当 t2 选择为空时,它 return 是包含 NULL 值的行(因为 MAX 函数 return 在空集上调用时为 NULL)。我希望它 return 是一个空集。我怎样才能实现它?

在 sql 服务器中试试这个 ...

with cte as
(
SELECT t1.name, MAX(t2.value) a
FROM t2
JOIN t1 ON t1.id = t2.t1_id
WHERE t2.t1_id = 1 AND t2.text_id = 16;
)
select * from cte where a is not null

在 Mysql

试试这个
  select p.* from 
(
    SELECT t1.name, MAX(t2.value) a
    FROM t2
    JOIN t1 ON t1.id = t2.t1_id
    WHERE t2.t1_id = 1 AND t2.text_id = 16;
) p where p.a is not null

Having 子句非常适合这里:

SELECT
  t1.name, MAX(t2.value)
FROM
  t2 JOIN t1 ON t1.id = t2.t1_id
WHERE
  t2.t1_id = 1 AND t2.text_id = 16
-- GROUP BY something?
HAVING
  MAX(t2.value) IS NOT NULL

当您不想获得结果集时,只需 RETURN

IF ((SELECT MAX(t2.Value) FROM t2) > 0)
  SELECT t1.name, MAX(t2.value)
  FROM t2
  JOIN t1 ON t1.id = t2.t1_id
  WHERE t2.t1_id = 1 AND t2.text_id = 16
ELSE
  RETURN

完全同意 by Gordon Linoff

将 select 查询包装在另一个 select 查询中是个好主意,但是当我们有很多聚合字段时,这样做会变得很麻烦,并且考虑到您必须像这样进行更改以超过 10 个查询。

您应该使用 GROUP BY 子句来查询,这将帮助您解决您提到的问题,但不仅如此,它还可以帮助您获得聚合值(基于字段)按子句分组。在你的情况下你应该使用 GROUP BY t1.name 可以工作。 因此您的聚合结果集将按名称分组。

如果您不使用 GROUP BY,那么认为您的名称字段有 100 个唯一值,但您只有 1 行,所有行都聚合了数据,这可能是错误的实现。

Here's 关于聚合函数和分组依据的更多详细信息。