鉴于以下情况:
CREATE TABLE A (A1 INTEGER, A2 INTEGER, A3 INTEGER);
INSERT INTO A(A1, A2, A3) VALUES (1, 1, 1);
INSERT INTO A(A1, A2, A3) VALUES (2, 1, 1);
我想选择A1
给定的最大值A2
和A3
值,并让这些值 (A2
和A3
) 也出现在返回的行中(例如,这样我就可以在连接中使用它们,因为下面的 SELECT 用于子查询)。
WHERE
鉴于 A2 和 A3 在子句中是硬编码的,因此能够执行以下操作似乎是合乎逻辑的:
SELECT MAX(A1) AS A1, A2, A3 FROM A WHERE A2=1 AND A3=1
然而,PostgreSQL(我也怀疑其他 RDBM)对此犹豫不决,并请求 A2 和 A3 的聚合函数,即使它们的值是固定的。所以相反,我要么必须做一个:
SELECT MAX(A1) AS A1, MAX(A2), MAX(A3) FROM A WHERE A2=1 AND A3=1
或:
SELECT MAX(A1) AS A1, 1, 1 FROM A WHERE A2=1 AND A3=1
我不喜欢第一个替代方案,因为我可以使用MIN
它并且它仍然可以工作,而第二个替代方案将位置参数的数量增加一倍,以便在从编程语言界面使用时提供值。理想情况下,我会想要一个UNIQUE
聚合函数,它可以断言所有值都相等并返回该单个值,或者甚至是RANDOM
一个随机返回一个值的聚合函数(因为我从WHERE
子句中知道它们都是相等的)。
有没有一种惯用的方式在 PostgreSQL 中编写上述内容?