SQL如何将表分配给带有大小写的变量



我有一个问题,我有3个表的日期为单日期列。我需要将其中一个分配给变量,以便稍后在查询中用作过滤器。举例说明这一点。

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子句中使用正确的表

我的想法是这样的:

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'时,我将有一个包含#all_days中这些日期的表,用于等简单查询

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

我正在使用SQL Server。

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

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

请注意,只有当表#all_days、@missing_days和#one_day只有一列并且其数据类型必须为DATE 时,这才会起作用

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

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

最新更新