gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:34:32 24 4
gpt4 key购买 nike

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

我想选择一对日期之间的所有数据。理想情况下,结果集的第一行和最后一行将是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com