我有一个问题,我有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
使用Union
、WHERE 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