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



我想查询数据库是否存在满足给定谓词的一行或多行。然而,我对有一行、两行或一百万行之间的区别不感兴趣——只是如果有"零"或"一个或多个"。我不希望Postgres浪费时间生成我不需要的精确计数。

在DB2中,我将这样做:
SELECT 1 FROM SYSIBM.SYSDUMMY1 WHERE EXISTS 
(SELECT 1 FROM REAL_TABLE WHERE COLUMN = 'VALUE')

,然后检查从查询返回的是零行还是一行。

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

如果我自己创建了一个单行虚拟表,并使用它来代替SYSIBM。SYSDUMMY1,查询优化器是否足够聪明,在运行查询时不实际读取该表,否则"做正确的事情"?

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

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

如果你想要一个正确/错误的答案:

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

这样做怎么样?

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

1表示存在一个值。0表示无值。

这将始终返回一行

如果您对"no row"感到满意,如果没有行匹配,您甚至可以:

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

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

最新更新