gpt4 book ai didi

sql-server - 如何在 SELECT 语句中有条件地执行 FROM 子句?

转载 作者:行者123 更新时间:2023-12-04 15:49:39 27 4
gpt4 key购买 nike

我有四个间隔:

Hourly
Daily
Monthly
Yearly

这些对应于四个表值函数:

Hourly(@Date, @Hour)
Daily(@Date)
Monthly(@Date)
Yearly(@Date)

接下来,我有一个 SSRS 参数 @Interval,其值等于上述四个间隔之一。根据参数的值,然后,我需要调用相应的函数。

我已经按照这些思路尝试了一些东西,但当然它不会解析:

SELECT * FROM
CASE
WHEN @Interval = 'Hourly' THEN (SELECT * FROM dbo.Hourly(@Date, @Hour) AS Result)
WHEN @Interval = 'Daily' THEN (SELECT * FROM dbo.Daily(@Date) AS Result)
WHEN @Interval = 'Monthly' THEN (SELECT * FROM dbo.Monthly(@Date) AS Result)
WHEN @Interval = 'Yearly' THEN (SELECT * FROM dbo.Yearly(@Date) AS Result)
END

因为我在 SSRS 数据集中使用它,所以它必须是单行 SQL 语句。

我运气不好吗?我是否必须重新考虑我的架构,还是可以在一个声明中完成?

--编辑--

根据请求,我包含了函数的 TSQL 代码。每个调用另一个,一直到 Yearly,作为一种重载结构。

Hourly(@Date, @Hour)

CREATE FUNCTION [dbo].[Hourly]
(
@Date DATETIME,
@Hour INT
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Daily](@Date)
WHERE
DATEPART(HOUR, [LogTime]) = @Hour
)

Daily(@Date)

CREATE FUNCTION [dbo].[Daily]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Monthly](@Date)
WHERE
DATEPART(DAY, [OffsetTime]) = DATEPART(DAY, @Date)
)

Monthly(@Date)

CREATE FUNCTION [dbo].[Monthly]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM [Yearly](@Date)
WHERE
DATEPART(MONTH, [OffsetTime]) = DATEPART(MONTH, @Date)
)

Yearly(@Date)

CREATE FUNCTION [dbo].[Yearly]
(
@Date DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT TOP 100 PERCENT * FROM [LogEntries]
WHERE DATEPART(YEAR, [OffsetTime]) = DATEPART(YEAR, @Date)
ORDER BY [OffsetTime]
)

最佳答案

我可以建议有一个像下面这样的函数。

CREATE FUNCTION [dbo].[GetData]
(
@Date DATETIME,
@Hour INT,
@Mode VARCHAR(10)
)
RETURNS TABLE
AS
RETURN
(

SELECT * FROM [LogEntries]
WHERE
(DATEPART(YEAR, [OffsetTime]) = DATEPART(YEAR, @Date) AND @Mode='Yearly')
OR
(DATEPART(MONTH, [OffsetTime]) = DATEPART(MONTH, @Date) AND @Mode='Monthly')
OR
( DATEPART(DAY, [OffsetTime]) = DATEPART(DAY, @Date) AND @Mode='Daily')
OR
( DATEPART(HOUR, [LogTime]) = @Hour AND @Mode='Hourly' )

)

在这里您需要传递一个名为@Mode 的额外参数,这样您就可以在存储过程中写入一个查询。

现在您可以像下面这样从您的 SP 调用电话。

SELECT * FROM [dbo].[GetData](@Date, @Hour,'Hourly')

SELECT * FROM  [dbo].[GetData](@Date, NULL,'Yearly')

关于sql-server - 如何在 SELECT 语句中有条件地执行 FROM 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54385003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com