2009-08-20 63 views
6

如何在Sql服务器中实现标量MAX(如Math.Max)。 (在essense我想要实现的东西像Max(表达式,0),使替换为0。负值)标量最大值在SQL Server中

我在其他线程解决方案见过

  • 创建一个标量函数(如何是与表现?)
  • 情况下,当表达式> 0 THEN ELSE表达0)(然后 '表达' 被评估两次?) MAX(聚集体)的
  • 复杂的用途。

什么是最好的? 为什么Sql Server没有内置这样的东西?任何并发症,我没有看到?

+0

http://stackoverflow.com/questions/989415/t-sql-equivalent-of-excel-max-function-to-return-larger-of-two-numbers – 2009-10-08 13:18:01

+0

http://stackoverflow.com/questions/124417/is-there-a-max-function-in-sql-server-that-takes-two-values-like-math-max-in-net – JoeCool 2011-02-10 19:28:48

+0

为了将此功能放入产品中,请在Microsoft Connect项目:http://connect.microsoft.com/SQLServer/feedback/details/767183/t-sql-provide-scalar-min-and-scalar-max – usr 2012-10-22 20:22:05

回答

1

你想在sql server中创建一个名为MAX的用户定义的标量函数来获取两个参数作为输入,表达式和最小值,并且如果表达式超过min值则返回表达式,否则返回最小值?

我不担心标量函数的性能,让服务器做到这一点。 我也会使用IF而不是CASE来测试> min值。

SQL服务器没有内置函数,因为他们认为它不会被广泛使用,我想。

+0

关于标量函数的性能:它们可能非常痛苦,但我认为假设只要没有表/视图逻辑,它们应该是相当快的(像内置在系统函数中一样) - Rein 0 secs ago – Rein 2009-08-20 16:12:43

5

在所有其他主要系统中,此功能被称为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报表少高性能。

+0

这很好,因为如果第一个表达式是一个复杂的计算,你将它与一个常数进行比较,你就可以了我必须写一次复杂的计算! – John 2012-06-28 15:01:50

+1

为了将此功能引入产品,请在Microsoft Connect项目上进行投票:http://connect.microsoft.com/SQLServer/feedback/details/767183/t-sql-provide-scalar-min-and-scalar-最大 – usr 2012-10-22 20:22:26

+0

投票!这绝对是一个有用的补充! – eidylon 2013-02-12 16:53:08

0

查询优化器应该防止多次计算表达式。

为便于阅读/可维护性,请考虑使用CTE在CASE语句之前计算表达式。