我有两个变量,一个叫PaidThisMonth,另一个叫OwedPast。它们都是SQL中一些子查询的结果。我如何选择两者中较小的一个,并将其作为一个名为PaidForPast的值返回?

MIN函数作用于列,而不是变量。


当前回答

SELECT (WHEN first > second THEN second ELSE first END) the_minimal FROM table

其他回答

这里有一个技巧,如果你想计算最大值(字段,0):

SELECT (ABS(field) + field)/2 FROM Table

如果字段为负,则返回0,否则返回字段。

使用临时表插入值范围,然后从存储过程或UDF中选择临时表的最小/最大值。这是一个基本的结构,所以可以根据需要随意修改。

例如:

CREATE PROCEDURE GetMinSpeed() AS
BEGIN

    CREATE TABLE #speed (Driver NVARCHAR(10), SPEED INT);
    '
    ' Insert any number of data you need to sort and pull from
    '
    INSERT INTO #speed (N'Petty', 165)
    INSERT INTO #speed (N'Earnhardt', 172)
    INSERT INTO #speed (N'Patrick', 174)

    SELECT MIN(SPEED) FROM #speed

    DROP TABLE #speed

END
Select MIN(T.V) FROM (Select 1 as V UNION Select 2 as V) T

SQL Server 2012和2014支持IIF(cont,true,false)函数。因此,对于最小的选择,你可以使用它像

SELECT IIF(first>second, second, first) the_minimal FROM table

虽然IIF只是CASE…WHEN…ELSE,写起来更容易。

用例:

   Select Case When @PaidThisMonth < @OwedPast 
               Then @PaidThisMonth Else @OwedPast End PaidForPast

作为内联表值UDF

CREATE FUNCTION Minimum
(@Param1 Integer, @Param2 Integer)
Returns Table As
Return(Select Case When @Param1 < @Param2 
                   Then @Param1 Else @Param2 End MinValue)

用法:

Select MinValue as PaidforPast 
From dbo.Minimum(@PaidThisMonth, @OwedPast)

附录: 当只处理两个可能的值时,这可能是最好的,如果有两个以上,考虑Craig使用values子句的回答。