如果有任何行,第一个查询将失败
quantity ISNULL(如Gordon所示)。
仅当所有行都具有时,第二个查询才会失败
quantity IS NULL。因此,它在大多数情况下应该是可用的。(而且速度更快。)
如果在 Postgres 12或更早版本中 需要NULL安全查询,即NULL是有效结果,请考虑:
SELECt id, quantityFROM productWHERe quantity IS NOT DISTINCT FROM (SELECt MAX(quantity) FROM product);
或者,可能更快:
SELECt id, quantityFROM ( SELECt *, rank() OVER (ORDER BY quantity DESC NULLS LAST) AS rnk FROM product ) subWHERe rnk = 1;
看:
- 与TOP n WITH TIES等效的PostgreSQL:是否限制“ with ties”?
Postgres 13 添加了标准的SQL子句 WITHTIES
:
SELECt idFROM productORDER BY quantity DESC NULLS LASTFETCH FIRST 1 ROWS WITH TIES;
db
<>在这里拨弄
可使用任何数量的
NULL值。
手册:
SQL:2008引入了不同的语法来实现相同的结果,PostgreSQL也支持该语法。它是:
OFFSET start { ROW | ROWS }FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { onLY | WITH TIES }在这种语法中,标准要求 _
startor _count
值是文字常量,参数或变量名;作为PostgreSQL扩展,允许使用其他表达式,但通常需要将其括在括号中以避免歧义。如果 _count_
在FETCH子句中省略if ,则默认为1。此WITH TIES选项用于根据该ORDERBY子句返回与结果集中最后一行相关的所有其他行;否则,默认为1 。ORDERBY在这种情况下是强制性的。ROW和ROWS以及FIRST和NEXT是不影响这些条款的影响干扰词。
值得注意的是,
WITH TIES不能与(non-standard)short语法一起使用
LIMIT n。
这是 最快的解决方案 。比您当前的任何一个查询都要快。对于 性能而言 更重要:在上有一个
索引
(quantity)。或更专业的覆盖索引允许仅索引扫描(速度稍快一点):
CREATE INDEX ON product (quantity DESC NULLS LAST) INCLUDE (id);
看:
- PostgreSQL中的覆盖索引对JOIN列有帮助吗?
我们需要
NULLS LAST使
NULL值最后以降序排列。看:
- 按ASC列排序,但先使用NULL值?



