SQL 如何将 table 赋值给带有 case when 的变量

SQL how to assign table to variable with case when

我有 3 个 table 带有日期单一日期列的问题。我需要将其中之一分配给变量,以便稍后在我的查询中用作过滤器。例子将清除这个。

CREATE TABLE #missing_days (trade_date DATE)  
INSERT INTO #missing_days (trade_date) VALUES ('2022-04-10'), ('2022-04-09')

CREATE TABLE #all_days (trade_date DATE)  
INSERT INTO #all_days (trade_date) VALUES ('2022-04-12'), ('2022-04-11'), ('2022-04-10'), ('2022-04-09')

CREATE TABLE #one_day (trade_date DATE)  
INSERT INTO #one_day (trade_date) VALUES ('2022-04-12')

现在我已经声明了参数来告诉我我想要什么运行

DECLARE @what_to_run VARCHAR(10) = 'ALL' --ALL run all dates, MISSING run only missing dates, ONE run only one day

现在,根据 @what_to_run 的值,我需要在稍后的简单 WHERE 子句中使用正确的 table。

我的想法是这样的:

DECLARE @Dates_to_run TABLE
(trade_date DATE)

SET @Dates_to_run = CASE WHEN @what_to_run = 'ALL' THEN (SELECT * FROM #all_days) 
                         WHEN @what_to_run = 'MISSING' THEN (SELECT * FROM #missing_days)  
                         ELSE (SELECT * FROM #one_day) END

但并没有取得太大的成功。

预期结果是,当 @what_to_run = 'ALL' 时,我将 table 和 #all_days 中的那些日期用于简单查询,例如

SELECT * 
FROM dt
WHERE trade_date IN (SELECT trade_date FROM @Dates_to_run)

我正在使用 SQL 服务器。

您必须插入到您的 table 变量中,也许这就是您想要的?

declare @what_to_run varchar(20) = 'all' 

DECLARE @Dates_to_run TABLE (trade_date DATE)


if @what_to_run = 'ALL'
begin 
     insert into @Dates_to_run
     select * from #all_days 
end
else if @what_to_run = 'MISSING'
begin
     insert into @Dates_to_run
     SELECT * FROM #missing_days
end
else
begin
     insert into @Dates_to_run
     SELECT * FROM #one_day
end

select * from @Dates_to_run

请注意,这仅在 table #all_days、@missing_days 和 #one_day 只有一列且数据类型必须为 DATE 时才有效

您可以通过 changing variable 使用 UnionWHERE condition 以及 Subquery 来获得您想要的结果

DECLARE @what_to_run VARCHAR(10) = 'ALL'
DECLARE @Dates_to_run TABLE
(trade_date DATE)
INSERT INTO @Dates_to_run 
SELECT trade_date FROM 
(SELECT *,'ALL' AS V FROM #all_days
UNION 
SELECT *,'MISSING'  AS V  FROM #missing_days
UNION 
SELECT *,'Oneday'  AS V   FROM #one_day) T
WHERE @what_to_run=T.V