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
使用 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
我有 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
使用 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