4

谁能向我解释下面的 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)

Case-When in 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)
4

1 回答 1

3

如果user.id是 a PRIMARY KEY,这些查询在语义上是相同的,尽管它们可能会产生不同的执行计划。

它们将返回1所有非空姓氏,因为您正在计算其组内的 group-by expession 的不同值,根据定义,这将是一个。

对于空姓氏,第一个查询将本质上返回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
于 2012-06-05T18:36:43.433 回答