4

我正在使用以下内容查询我的数据库(Postgres 8.4):

SELECT COUNT(*) FROM table WHERE indexed_varchar LIKE 'bar%';

这个复杂度是 O(N) 因为 Postgres 必须计算每一行。Postgres 9.2 具有仅索引扫描,但不幸的是,升级不是一种选择。

但是,获得准确的行数似乎有点过头了,因为我只需要知道以下三种情况中的哪一种是正确的:

  • 查询不返回任何行。
  • 查询返回一行。
  • 查询返回两行或多行。

所以我不需要知道查询返回 10,421 行,只需要返回两个以上。

我知道如何处理前两种情况:

SELECT EXISTS (SELECT COUNT(*) FROM table WHERE indexed_varchar LIKE 'bar%');

如果存在一行或多行,则返回 true,而 false 则不存在。

关于如何以有效的方式扩展它以涵盖所有三种情况的任何想法?

4

2 回答 2

6
SELECT COUNT(*) FROM (
  SELECT * FROM table WHERE indexed_varchar LIKE 'bar%' LIMIT 2
) t;
于 2012-11-20T17:16:13.703 回答
1

应该很简单。您可以使用语句LIMIT执行您想要的操作并返回数据(计数) 。CASE

SELECT CASE WHEN c = 2 THEN 'more than one' ELSE CAST(c AS TEXT) END 
FROM 
     (
      SELECT COUNT(*) AS c 
      FROM   (
              SELECT 1 AS c FROM table WHERE indexed_varchar LIKE 'bar%' LIMIT 2
             ) t
     ) v
于 2012-11-20T17:19:51.693 回答