使用查询结果确定sql中where子句中的值?

h7appiyu  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(437)

所以基本上我有一个查询,我想用一个日期过滤,但是这个日期可能会根据系统中的数据而改变。
如果没有日期为>='x'的记录,我想用>='y'代替
目前,我得到了如下乱七八糟的东西(为了避免使用实际的表名和类似的东西而进行了伪编码)

With a as (SELECT 
count(column_id) as num
 FROM tableA
    WHERE ADate >= getdate() - 8)
,
b as (SELECT
case when num = '0' then getdate() - 15 else getdate() - 8 end as DateToUseInQuery
from A)

SELECT * 
FROM tableB

Bunch of joins to other tables

WHERE BDate >= DateToUseInQuery

一般的想法是,如果没有记录的一周前,使用2周前
我尝试在where子句中使用一个查询,例如:

WHERE BDate >= (SELECT DateToUseInQuery FROM b)

但是查询运行了11分钟之后我停止了它(在我尝试放入这个额外的位之前大约18秒)
我一直在考虑尝试设置一个变量作为日期,但我不能在cte中这样做,当我在之后这样做时,它会破坏其他一切。
所以基本上:
有没有比我尝试的那种笨手笨脚的方式更简单的方法呢?
如果我的方式是好的,我怎么能把这个日期正确地输入where条款呢?

t40tm48m

t40tm48m1#

你可以试试这样的。我使用嵌套的select和case语句来确定天数。
也许有一个更漂亮的方法,但这是可行的。

SELECT COUNT(column_id) AS num FROM TableA
WHERE ADate >=
DATEADD(Day,
    (SELECT 
    CASE
    WHEN EXISTS(
        SELECT 1 FROM TableA
        WHERE ADate >= DATEADD(Day,-8,GETDATE())) 
    THEN  -8
    ELSE  -15
    END AS 'dt')
,GETDATE());

相关问题