有人可以向我解释下面的SQL语句之间的区别吗?我可以看到存在差异,但我无法确定可以使它们产生不同结果的确切条件。顺便说一下,我认为distinct
子句对user.id
字段没有影响,因为所有id都已经是唯一的。查询的目的是计算唯一(非空)姓氏的数量。如果姓氏为空,则计为唯一。
我认为这个问题的一般情况是在case-when语句中使用聚合函数。
在Case-When中计数:
SELECT
(case when (substr(u.name,40,40) <> ' ')
then count(distinct(substr(u.name,40,40)))
else count(u.id)
end) as "LAST_NAME",
FROM
users u
GROUP BY
substr(u.name,40,40)
案例 - 在Count内:
SELECT
count (distinct case when (substr(u.name,40,40) <> ' ')
then substr(u.name,40,40)
else to_char(u.id)
end) as "LAST_NAME",
FROM
users u
GROUP BY
substr(u.name,40,40)
答案 0 :(得分:3)
如果user.id
是PRIMARY KEY
,这些查询在语义上是相同的,尽管它们可能会产生不同的执行计划。
对于所有非空的姓氏,他们将返回1
,因为您正在计算其组内的分组的不同值,根据定义,它将恰好是一个。
对于空的姓氏,第一个查询必须返回COUNT(u.id)
,第二个查询将返回COUNT(DISTINCT TO_CHAR(u.id))
,假设u.id
是唯一的,则GROUP BY
是相同的。
我认为您需要从第二个查询中删除SELECT count (distinct case when (substr(u.name,40,40) <> ' ')
then substr(u.name,40,40)
else to_char(u.id)
end) as "LAST_NAME",
FROM
users u
:
{{1}}