4

如何在 Sql Server 中获得 3 个值中的最低值?

MySQL 中的相同函数称为 LEAST,而 SQL Server 中的比较?

4

5 回答 5

9

您可以在没有嵌套案例的情况下执行此操作:

select (case when val1 < val2 and val1 < val3 then val1
             when val2 < val3 then val2
             else val3
        end) as least_of_three

这似乎很清楚它在做什么。它也很容易概括。

一定要小心 NULL —— LEAST 和 GREATEST 会忽略它。如果你需要处理这些,那就有点麻烦了:

select (case when val1 <= coalesce(val2, val1) and val1 <= coalesce(val3, val1) then val1
             when val2 <= coalesce(val3, val2) then val2
             else val3
        end) as least_of_three

请注意,我已将“<”更改为“<=”。我使用合并通过评估为真来“忽略”该值。因此,如果 val2 为空,则 val1 始终小于 val2。我选择了这种方法,因为它适用于所有数据类型(字符串、数字、日期)。

编辑:

我通常不会回去写七岁的问题的答案,但这个问题显然是SQL Server。最好的方法使用apply

select t.*, max_val
from t cross apply
     (select max(v.val) as max_val
      from (values (t.val1), (t.val2), . . .
     ) v(val);

请注意,此解决方案在 MySQL 中不起作用,因为它不支持横向连接。

于 2012-05-13T13:53:53.180 回答
4

显而易见的嵌套 case 语句是:

select case when val1 < val2 then
               case when val1 < val3 then val1
               else val3
               end
        when val2 < val3 then val2
               else val3
    end
from cols;

create table cols (val1 int, val2 int, val3 int);

它不会很容易地扩展到更高的比较 #,并且它不包括合并语句来抑制空值。

唯一的优势是其他程序员在查看您的代码时将能够快速弄清楚。(除非这是性能瓶颈,否则我认为这是一个很好的考虑!)

于 2012-05-13T07:21:25.127 回答
2

SQL Server 中没有类似于 mysql 中的 Least() 函数的函数

MySQL 的 Least() 函数执行以下操作

取两个或多个参数,返回最小(最小值)参数。使用以下规则比较参数:

如果任何参数为 NULL,则结果为 NULL。不需要比较。

如果在 INTEGER 上下文中使用返回值或所有参数都是整数值,则将它们作为整数进行比较。

如果在 REAL 上下文中使用返回值或所有参数都是实值,则将它们作为实数进行比较。

如果参数包含数字和字符串的混合,则将它们作为数字进行比较。

如果任何参数是非二进制(字符)字符串,则将参数作为非二进制字符串进行比较。

在所有其他情况下,参数作为二进制字符串进行比较。

sql server 的 Min() 函数返回不带参数的表中列的最小值

这是一个模拟,但仍然不像 Least 因为它只能接受整数

CREATE FUNCTION [dbo].[GetSmallest]
(
    -- Add the parameters for the function here
    @val1 int,  @val2 int,  @val3 int
)
RETURNS int
AS
BEGIN
Declare @result int
set @result = case when @val1 < @val2 then
               case when @val1 < @val3 then 
                @val1
               else
                @val3
               end
        when @val2 < @val3 then 
                @val2
        else
                 @val3
    end
  return @result  
END 

这是你的称呼

SELECT [dbo].[GetSmallest] (   32  ,31  ,6)
于 2012-05-13T11:29:54.310 回答
2

如果你想避免嵌套 CASE 语句,这会做(虽然有点尴尬):

CREATE TABLE #t(ID INT, V1 INT, V2 INT, V3 INT)
INSERT INTO #t VALUES
    (1, 10, 20, 30)
    , (2, 60, 50, 40)

SELECT * FROM #t t1
CROSS APPLY (SELECT MAX(V), MIN(V) FROM (
SELECT V1 AS V
UNION SELECT V2
UNION SELECT V3 
) T) AS t2(VMAX, VMIN)

DROP TABLE #t
于 2012-05-13T07:08:47.210 回答
-5

您可以在 T-SQL 中使用“Min”函数:

SELECT MIN(Value) FROM MyTable
于 2012-05-13T06:30:12.250 回答