sql - 测试范围内的值

标签 sql postgresql

我想测试一个值范围是否介于 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)

编辑 解决方案分析:

  1. @GordonLinoff 解决方案(1.039 秒内 16625 行)

QUERY PLAN: Seq Scan on mytable (cost=0.00..8085.83 rows=14867 width=293)

  1. @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/

相关文章:

sql - PostgreSQL : Check if the last number is the highest

java - 如何使用自己的运行器在 gitlab 作业中将 Postgres 作为服务运行?

ruby-on-rails - Rails 3.2 从不适用的复选框更新 bool 值

json - 返回多个键值对的 json,而不是单对键值 json 的列表

php - 计算具有许多不同参数的表中的行数

MySQL:多个表的注释

java - javax.sql 和 java.sql 之间的区别?

sql - quote_ident() 不向列名添加引号 "first"

java - DBMS 与 Web 应用程序层中的密码哈希验证/检查

带有连接和子查询的非规范化表中的mysql查询