一尘不染

postgres中的distinct()函数(不选择限定符)

sql

我刚刚遇到了一个SQL查询,特别是对Postgres数据库的查询,该查询使用了一个名为“ distinct”的函数。即:

select distinct(pattern) as pattern, style, ... etc ...
from styleview
where ... etc ...

请注意,这不是SELECT上的普通DISTINCT限定符-
至少它不是DISTINCT限定符的常规语法,请注意括号。显然是使用DISTINCT作为函数,或者也许这是一些特殊的语法。

知道这意味着什么吗?

我试着玩一点,如果我写

select distinct(foo)
from bar

我得到的结果与

select distinct foo
from bar

当我将它与同一选择中的其他字段组合在一起时,我不清楚它到底在做什么。

我在Postgres文档中找不到任何内容。

谢谢你的帮助!


阅读 209

收藏
2021-05-16

共1个答案

一尘不染

(这个问题很老,但是在Google的“ ql区别不是函数”中排名很高(第二,第一个是Stack
Overflow),但是仍然缺少令人满意的答案,所以…)

实际上,这 SELECT上的普通DISTINCT限定符-但语法具有误导性(您对此很正确)。

DISTINCT永远不是函数,永远不是关键字。在这里(错误地)使用它就像是一个函数,但是

select distinct(pattern) as pattern, style, ... etc ...
from styleview
where ... etc ...

实际上等效于以下所有形式:

-在以下位置添加一个空格distinct

select distinct (pattern) as pattern, style, ... etc ...
from styleview
where ... etc ...

-删除列名周围的括号:

select distinct pattern as pattern, style, ... etc ...
from styleview
where ... etc ...

-缩进条款内容:

select distinct
    pattern as pattern, style, ... etc ...
from
    styleview
where
    ... etc ...

-删除与列名相同的冗余别名:

select distinct
    pattern, style, ... etc ...
from
    styleview
where
    ... etc ...

补充阅读:


注意:OMG Ponies回答当前问题时提到了DISTINCTONPostgreSQL的扩展名。
但是(正如Jay在评论中正确指出的那样),这里并没有使用它,因为查询(和结果)应该是不同的,例如:

select distinct on(pattern) pattern, style, ... etc ...
from styleview
where ... etc ...
order by pattern, ... etc ...

相当于:

select  distinct on (pattern)
    pattern, style, ... etc ...
from
    styleview
where
    ... etc ...
order by
    pattern, ... etc ...

补充阅读:


注意:LukasEder在对当前问题的回答中提到了在聚合函数中使用DISTINCT关键字
COUNT(DISTINCT (foo, bar, ...))语法:HSQLDB所具有的语法
(或者COUNT(DISTINCT foo, bar, ...)也适用于MySQL,但也适用于PostgreSQL,SQL
Server,Oracle以及其他)。
但是(很明显)这不是这里使用的。

2021-05-16