Sql Server 中的标量最大值
Posted
技术标签:
【中文标题】Sql Server 中的标量最大值【英文标题】:Scalar Max in Sql Server 【发布时间】:2009-08-20 15:55:24 【问题描述】:如何在Sql server(如Math.Max)中实现标量MAX。 (本质上我想实现 Max(expression, 0) 之类的东西,将负值替换为 0。)
我在其他线程解决方案中见过
创建一个标量函数(性能如何?) 表达式 > 0 THEN 表达式 ELSE 0) (那么“表达式”被计算两次?) 的复杂用途 最大(聚合)。什么是最好的? 为什么 Sql Server 没有内置这样的东西?有什么我看不到的并发症吗?
【问题讨论】:
***.com/questions/989415/… ***.com/questions/124417/… 为了将此功能引入产品,请对 Microsoft Connect 项目进行投票:connect.microsoft.com/SQLServer/feedback/details/767183/… 功能请求已移动,可以在here投票 【参考方案1】:在所有其他主要系统中,此函数称为GREATEST
。
SQL Server
严重缺少它。
你可以写一堆 case 语句,或者使用类似这样的语句:
SELECT (
SELECT MAX(expression)
FROM (
SELECT expression
UNION ALL
SELECT 0
) q
) AS greatest
FROM table_that_has_a_field_named_expression
后者的性能比CASE
语句稍差。
【讨论】:
这很好,因为如果第一个表达式是一个复杂的计算并且你将它与一个常数进行比较,你只需要编写一次复杂的计算! 为了将此功能引入产品,请对 Microsoft Connect 项目进行投票:connect.microsoft.com/SQLServer/feedback/details/767183/… 投票!这绝对是一个有用的补充! 嗨!你知道这是否已经被添加到 SQL Server 中吗?我检查了 MS Connect 链接,但看起来他们关闭了 Connect。谢谢。 好的,谢谢,我也检查了一些,找不到任何东西。这太糟糕了,因为我认为其他 RDBMS 也有。【参考方案2】:你想在sql server中创建一个名为MAX的用户自定义标量函数,将两个参数作为输入,一个表达式和一个最小值,如果超过最小值则返回表达式,否则返回最小值?
我不会担心标量函数的性能,让服务器来做。 我也会使用 IF 而不是 CASE 来测试 > 最小值。
SQL 服务器没有为您提供内置函数,因为他们认为它不会被广泛使用,我猜。
【讨论】:
关于标量函数的性能:它们可能真的很痛苦,但我认为可以安全地假设只要不涉及表/视图逻辑,它们应该很快(如内置在系统功能中?) – Rein 0 秒前 IF 和 CASE 是不同的语句类型。是否可以使用 IF 而不是 CASE 取决于您想在哪里使用它。【参考方案3】:查询优化器应该防止表达式被计算多次。
为了可读性/可维护性,考虑在 CASE 语句之前使用 CTE 来计算表达式。
【讨论】:
以上是关于Sql Server 中的标量最大值的主要内容,如果未能解决你的问题,请参考以下文章
SQL:从 SQL Server 中的嵌套 JSON 中查找最大值
Linq - 从 SQL Server 中的 nvarchar 类型列中查找最大值