我正在使用以下内容查询我的数据库(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%');
如果存在一行或多行且false不存在,则返回true。
有关如何将此扩展到高效包含所有三种情况的任何想法?
答案 0 :(得分:6)
SELECT COUNT(*) FROM (
SELECT * FROM table WHERE indexed_varchar LIKE 'bar%' LIMIT 2
) t;
答案 1 :(得分: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