有效地确定是否有任何行满足 Postgres 中的谓词
Efficiently determine if any rows satisfy a predicate in Postgres
我想查询数据库是否存在满足给定谓词的一行或多行。但是,我对这样的一行、两行或一百万行之间的区别不感兴趣——只是如果有 'zero' 或 'one or more'。而且我不希望 Postgres 浪费时间生成我不需要的精确计数。
在 DB2 中,我会这样做:
SELECT 1 FROM SYSIBM.SYSDUMMY1 WHERE EXISTS
(SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE')
然后检查查询返回的是零行还是一行。
但是 Postgres 没有虚拟 table 可用,那么最好的选择是什么?
如果我自己创建一个单行虚拟 table 并使用它代替 SYSIBM.SYSDUMMY1,查询优化器是否足够聪明以至于在 [=27 时不会实际读取 table =] 查询,否则 'do the right thing'?
这样做怎么样?
SELECT (CASE WHEN EXISTS (SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE') THEN 1 ELSE 0 END)
1
表示有值。 0
表示没有值。
这总是 return 一行。
PostgreSQL 没有虚拟机 table 因为你不需要它。
SELECT 1 WHERE EXISTS
(SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE')
或者,如果您想要 true/false 答案:
SELECT EXISTS(SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE')
如果您满意 "no row" 如果没有行匹配,您甚至可以:
SELECT 1 FROM real_table WHERE column = 'VALUE' <b>LIMIT 1</b>;
性能与EXISTS
基本相同。大表的性能关键是匹配索引。
我想查询数据库是否存在满足给定谓词的一行或多行。但是,我对这样的一行、两行或一百万行之间的区别不感兴趣——只是如果有 'zero' 或 'one or more'。而且我不希望 Postgres 浪费时间生成我不需要的精确计数。
在 DB2 中,我会这样做:
SELECT 1 FROM SYSIBM.SYSDUMMY1 WHERE EXISTS
(SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE')
然后检查查询返回的是零行还是一行。
但是 Postgres 没有虚拟 table 可用,那么最好的选择是什么?
如果我自己创建一个单行虚拟 table 并使用它代替 SYSIBM.SYSDUMMY1,查询优化器是否足够聪明以至于在 [=27 时不会实际读取 table =] 查询,否则 'do the right thing'?
这样做怎么样?
SELECT (CASE WHEN EXISTS (SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE') THEN 1 ELSE 0 END)
1
表示有值。 0
表示没有值。
这总是 return 一行。
PostgreSQL 没有虚拟机 table 因为你不需要它。
SELECT 1 WHERE EXISTS
(SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE')
或者,如果您想要 true/false 答案:
SELECT EXISTS(SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE')
如果您满意 "no row" 如果没有行匹配,您甚至可以:
SELECT 1 FROM real_table WHERE column = 'VALUE' <b>LIMIT 1</b>;
性能与EXISTS
基本相同。大表的性能关键是匹配索引。