有效地确定任何行是否满足Postgres中的谓词

时间:2015-09-13 20:49:57

标签: sql postgresql exists

我想查询数据库是否存在满足给定谓词的一行或多行。但是,我对这样一行,两行或一百万行之间的区别不感兴趣 - 只要有零'或者'一个或多个'。而且我不希望Postgres浪费时间来产生我不需要的精确计数。

在DB2中,我会这样做:

SELECT 1 FROM SYSIBM.SYSDUMMY1 WHERE EXISTS 
(SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE')

然后检查查询是否返回零行或一行。

但Postgres没有可用的虚拟表,那么最佳选择是什么?

如果我自己创建一个单行虚拟表并使用它来代替SYSIBM.SYSDUMMY1,那么查询优化器是否足够聪明,在运行查询时不会实际读取该表,否则“正确”东西'?

3 个答案:

答案 0 :(得分:3)

PostgreSQL没有虚拟表,因为你不需要它。

pg_

或者,如果你想要一个真/假答案:

SELECT 1 WHERE EXISTS 
(SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE')

答案 1 :(得分:2)

这样做怎么样?

SELECT (CASE WHEN EXISTS (SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE') THEN 1 ELSE 0 END)

1表示有一个值。 0表示无价值。

这将始终返回一行。

答案 2 :(得分:0)

如果您对"没有排"如果没有行匹配,你甚至可以:

SELECT 1 FROM real_table WHERE column = 'VALUE' LIMIT 1;

效果与EXISTS基本相同。大表性能的关键是匹配索引。