我想测试一个值范围是否介于 PostgreSQL 请求中的列值之间。
假设 (2010,2012,2014,2016,2018)
是我的年份值范围。
我想检查 foreach 是否在 extract(year from dtstart) 和 extract(year from dtend) 之间
。
我是否必须为每个值生成一行?
select * from mytable where
:year1 between extract(year from dtstart) and extract(year from dtend)
and
:year2 between extract(year from dtstart) and extract(year from dtend)
and
...
或者是否有一种语法可以让它一次完成?
select * from mytable where
(2010,2012,2014,2016,2018) between extract(year from dtstart) and extract(year from dtend)
编辑 解决方案分析:
- @GordonLinoff 解决方案(1.039 秒内 16625 行)
QUERY PLAN: Seq Scan on mytable (cost=0.00..8085.83 rows=14867 width=293)
- @a_horse_with_no_name 解决方案(1.113 秒内 16625 行)
QUERY PLAN: Seq Scan on mytable (cost=0.00..5577.04 rows=1 width=293)
检索行所花费的时间没有太大差异,因此在我的情况下,两种解决方案都具有足够的性能。另一方面,我不知道如何阅读查询计划成本。
最佳答案
好吧,因为你正在使用 和
,你和看看极端情况:
select *
from mytable
where least(:year1, :year2, . . .) between extract(year from dtstart) and extract(year from dtend) and
greatest(:year1, :year2, . . .) between extract(year from dtstart) and extract(year from dtend);
关于sql - 测试范围内的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48887994/