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
假设您的表名为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)
作为替代a_horse_with_no_name的溶液,最简单的方法是使用<
与该any
行或阵列的比较与阵列:
SELECT city FROM cities WHERE 80 < any (temps);
Run Code Online (Sandbox Code Playgroud)
请参阅SQLFiddle。
这是没有必要对UNNEST阵列,作为any
和all
在阵列上以及上行集工作。
与使用数组运算符不同,此操作不会受益于并且不能在 上使用索引(b 树或 GIN)temps
,因此如果您有,则拆分temps
为具有外键引用的单独表的规范化设计cities
实际上可能会更快许多城市和/或许多样本。
早些时候我建议你可能想要使用GIN
数组索引和数组运算符,但我错了。这些不支持所需的操作;我在测试中犯了一个错误,使它们看起来像。
对于频繁更新,我会将其规范化到另一个表中,并对该表进行 btree-index 索引。如果只有少量数据,我不会打扰索引,我只会使用< any (temps)
.
归档时间: |
|
查看次数: |
1567 次 |
最近记录: |