如何使聚合查询 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 关于聚合函数和分组依据的更多详细信息。
我有一个这样的 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
完全同意
将 select 查询包装在另一个 select 查询中是个好主意,但是当我们有很多聚合字段时,这样做会变得很麻烦,并且考虑到您必须像这样进行更改以超过 10 个查询。
您应该使用 GROUP BY 子句来查询,这将帮助您解决您提到的问题,但不仅如此,它还可以帮助您获得聚合值(基于字段)按子句分组。在你的情况下你应该使用 GROUP BY t1.name 可以工作。 因此您的聚合结果集将按名称分组。
如果您不使用 GROUP BY,那么认为您的名称字段有 100 个唯一值,但您只有 1 行,所有行都聚合了数据,这可能是错误的实现。
Here's 关于聚合函数和分组依据的更多详细信息。