在条件中计数函数

时间:2012-06-05 18:27:56

标签: sql oracle

有人可以向我解释下面的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)

1 个答案:

答案 0 :(得分:3)

如果user.idPRIMARY 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}}