gpt4 book ai didi

sql-server - T-SQL 用户定义函数或类似函数,用于从值列表中计算最大值(日期)

转载 作者:行者123 更新时间:2023-12-02 05:19:19 25 4
gpt4 key购买 nike

假设我有一个来源,我必须这样查询:

Select Fields 
from TableA A
join TableB B on A.SomeField = B.SomeField
join TableC C on B.SomeField = C.SomeField
Join TableD D on C.SomeField = D.SomeField
Where
CustomMaxDateFunction (A.SomeDateField, B.SomeDateField, C.SomeDateField, D.SomeDateField) > '20130101 23:59:00'

我知道我可以像下面这样写 where 子句,但我不想这样做:

Where 
A.SomeDateField > '20130101 23:59:00'
OR B.SomeDateField > '20130101 23:59:00'
OR C.SomeDateField > '20130101 23:59:00'
OR D.SomeDateField > '20130101 23:59:00'

请记住,要比较的列数会根据连接中源表的数量而变化。

关于执行此操作的最简单方法的任何建议,因为我们将不得不重复使用自定义函数(或存储过程)。

最佳答案

无需创建新函数,您只需使用内置的 MAX 聚合即可。

SELECT MAX(v) FROM (VALUES(A.SomeDateField),(B.SomeDateFiled),(C.SomeDateField),(D.SomeDateField))dates(v)

或在您的查询上下文中:

SELECT *
FROM TableA AS A
JOIN TableB AS B
ON ...
JOIN TableC AS C
ON ...
JOIN TableD AS D
ON ...
WHERE (SELECT MAX(v) FROM (VALUES(A.SomeDateField),(B.SomeDateFiled),(C.SomeDateField),(D.SomeDateField))dates(v)) > '20130101 23:59:00'

如果不够干净,你可以把它包装成一个函数

CREATE FUNCTION dbo.CustomMaxDateFunction(@v1 DATETIME, @v2 DATETIME, @v3 DATETIME, @v4 DATETIME)
RETURNS TABLE
AS
RETURN SELECT MAX(v) MaxDate FROM (VALUES(@v1),(@v2),(@v3),(@v4))dates(v);

然后这样调用它:

SELECT *
FROM TableA AS A
JOIN TableB AS B
ON ...
JOIN TableC AS C
ON ...
JOIN TableD AS D
ON ...
CROSS APPLY dbo.CustomMaxDateFunction(A.SomeDateField, B.SomeDateFiled, C.SomeDateField, D.SomeDateField) AS mdf
WHERE mdf.MaxDate > '20130101 23:59:00'

远离此查询上下文中的其他形式的函数,因为它们会损害性能: http://sqlity.net/en/498/t-sql-tuesday-24-prox-n-funx/

然而,所有函数都有一个共同点,即您固定使用给定数量的参数,因此第一个选项可能是您最好的选择。

编辑:如果你真的喜欢函数的想法,你可以这样做:

CREATE FUNCTION dbo.CustomMaxDateFunction(@v1 DATETIME, @v2 DATETIME, @v3 DATETIME, @v4 DATETIME)
RETURNS TABLE
AS
RETURN SELECT MAX(v) MaxDate FROM (VALUES(@v1),(@v2),(@v3),(@v4))dates(v) WHERE v IS NOT NULL;

现在你可以这样调用它:

SELECT *
FROM TableA AS A
JOIN TableB AS B
ON ...
CROSS APPLY dbo.CustomMaxDateFunction(A.SomeDateField, B.SomeDateFiled, NULL, NULL) AS mdf
WHERE mdf.MaxDate > '20130101 23:59:00'

您基本上必须用 NULL 填充未使用的参数。函数中的附加 WHERE 子句可防止您在其他情况下收到有关已消除 NULL 值的警告。正如 RBarryYoung 在评论中提到的,SQL Server 中的函数没有真正的可选参数功能。

关于sql-server - T-SQL 用户定义函数或类似函数,用于从值列表中计算最大值(日期),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14145614/

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