sql - 将查询扩展到 WHERE 子句中指定的范围之外

标签 sql postgresql union

一定有更好的方法来编写这个查询。

我想选择一对日期之间的所有数据。理想情况下,结果集的第一行和最后一行将是 WHERE 子句中指定的行。如果这些行不存在,我希望在请求的范围之前和之后的行。

一个例子:

如果我的数据是:

...
135321, 20090311 10:15:00
135321, 20090311 10:45:00
135321, 20090311 11:00:00
135321, 20090311 11:15:00
135321, 20090311 11:30:00
135321, 20090311 12:30:00
...

查询是:

    SELECT * 
    FROM data_bahf 
    WHERE param_id = 135321 
    AND datetime >= '20090311 10:30:00' 
    AND datetime <= '20090311 12:00:00'

我希望返回的数据包括 10:15 和 12:30 的行。不仅仅是那些严格满足 WHERE 子句的。

这是我想到的最好的。

SELECT * FROM (
    SELECT * 
    FROM data_bahf 
    WHERE param_id = 135321 
    AND datetime > '20090311 10:30:00' 
    AND datetime < '20090311 12:00:00'

    UNION

    (
        SELECT * FROM data_bahf 
        WHERE param_id = 135321 
        AND datetime <= '20090311 10:30:00' 
        ORDER BY datetime desc
        LIMIT 1
    )

    UNION

    (
        SELECT * FROM data_bahf 
        WHERE param_id = 135321 
        AND datetime >= '20090311 12:00:00'
        ORDER BY datetime asc
        LIMIT 1
    )
) 
AS A
ORDER BY datetime

(暂时忽略 SELECT * 的使用)

编辑: 我在 param_id、datetime 和 (param_id, datetime) 上有索引

最佳答案

我会这样说:

SELECT 
  o.* 
FROM 
  data_bahf o
WHERE 
  o.param_id = 135321 
  AND o.datetime BETWEEN
  ISNULL(
    (
      SELECT   MAX(datetime) 
      FROM     data_bahf i
      WHERE    i.param_id = 135321 AND i.datetime <= '20090311 10:30:00'
    ),
    '0001-01-01 00:00:00'
  )
  AND
  ISNULL(
    (
      SELECT   MIN(datetime) 
      FROM     data_bahf i
      WHERE    i.param_id = 135321 AND i.datetime >= '20090311 12:00:00'
    ),
    '9999-12-31 23:59:59'
  )

编辑:添加后备。
当没有匹配子查询的行时,会得到一个NULL值,这个值必须被ISNULL()或者BETWEEN捕获> 运算符将失败,主查询将完全不返回任何行。

关于sql - 将查询扩展到 WHERE 子句中指定的范围之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/643885/

相关文章:

mysql - 具有三级外键间接的 SQL select

sql - 如何合并行并在 SQL 表中添加列?

mysql - 如何获取mysql中同一张表的计数值为零?

sql - 合并SQL Server中行数不同的两个表

php - 如何使用 for 循环和 union all 按列进行分组

python - 从字典创建 SQL 查询

MySQL只有一条活跃记录,多条非活跃记录

SQL Join 从左表和右表返回空行

ruby-on-rails - 选择 rails 中具有最大列值的行

ruby-on-rails - 让 find_by in rails 返回多个结果