PostgreSQL:查询数据库中包含整数 [] > 或 < 超过指定值的行

Jos*_*rns 7 postgresql postgresql-9.1

我有一个表,它存储过去 5 天的历史温度,存储在基于城市的整数 [] 列中。问题是:如何查询值大于或小于指定值的条目?这是一个示例表:

+=========+==================+
| city    | temps            |
+=========+==================+
| Seattle | {65,72,63,56,72} |
+---------+------------------+
| Miami   | {83,75,69,72,79} |
+---------+------------------+
Run Code Online (Sandbox Code Playgroud)

假设我想查询温度高于 80 的城市。在此示例中,只有迈阿密的温度高于 80,因此只应返回该行。我尝试了一些没有成功的查询,查看了 intarray,但这似乎也不能解决我的问题。非常感谢!

我正在运行 PostgreSQL 9.1

a_h*_*ame 6

假设您的表名为readings

查找至少一个温度大于 80 的城市:

select *
from readings r
where exists (select 1 
              from unnest(r.temps) i
              where i > 80)
Run Code Online (Sandbox Code Playgroud)

查找所有温度都大于 68 的城市:

select *
from readings r
where 68 < all (select i
                from unnest(r.temps) i)
Run Code Online (Sandbox Code Playgroud)

  • 您不需要“取消嵌套”数组,您可以直接在“any”和“all”中使用它们。请参阅添加的答案。 (2认同)

Cra*_*ger 6

作为替代a_horse_with_no_name的溶液,最简单的方法是使用<any行或阵列的比较与阵列:

SELECT city FROM cities WHERE 80 < any (temps);
Run Code Online (Sandbox Code Playgroud)

请参阅SQLFiddle

这是没有必要对UNNEST阵列,作为anyall在阵列上以及上行集工作。

与使用数组运算符不同,此操​​作不会受益于并且不能在 上使用索引(b 树或 GIN)temps,因此如果您有,则拆分temps为具有外键引用的单独表的规范化设计cities实际上可能会更快许多城市和/或许多样本。

早些时候我建议你可能想要使用GIN数组索引和数组运算符,但我错了。这些不支持所需的操作;我在测试中犯了一个错误,使它们看起来像。

对于频繁更新,我会将其规范化到另一个表中,并对该表进行 btree-index 索引。如果只有少量数据,我不会打扰索引,我只会使用< any (temps).