从SQL SERVER中的3个值中获取较低的值

时间:2012-05-13 06:26:12

标签: sql sql-server tsql

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

MySQL中的相同功能称为LEAST,并在SQL Server中进行比较?

5 个答案:

答案 0 :(得分:4)

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

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

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

请注意NULL - 最低和最大的忽略。如果你需要处理这些,那就有点麻烦了:

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

注意我已经改变了“&lt;”到“&lt; =”。我使用coalesce通过评估为true来“忽略”该值。因此,如果val2为null,则val1始终小于val2。我选择了这种方法,因为它适用于所有数据类型(字符串,数字,日期)。

答案 1 :(得分:3)

显而易见的嵌套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;

on

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

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

另一个程序员在查看代码时能够快速解决问题。 (除非这是性能瓶颈,否则我认为这是一个非常好的考虑因素!)

答案 2 :(得分: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

答案 3 :(得分: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)

答案 4 :(得分:-3)

您可以在T-SQL中使用“Min”功能:

SELECT MIN(Value) FROM MyTable