在SQL中获取最少两个值

Mal*_*ist 158 t-sql sql-server

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

MIN函数适用于列,而不是变量.

Mer*_*soy 122

SQL Server 2012和2014支持IIF(cont,true,false)功能.因此,对于最小的选择,您可以使用它

SELECT IIF(first>second, second, first) the_minimal FROM table
Run Code Online (Sandbox Code Playgroud)

  • 可能是的.但更容易写. (47认同)
  • [`IIF`](https://msdn.microsoft.com/en-us/library/hh213574.aspx?f=255&MSPPError=-2147217396)只是`CASE ... WHEN ... ELSE'的语法糖. (6认同)
  • @MertGülsoy 并且更易于阅读,这应该位于每个人优先级列表的顶部,紧随正确性之后。 (5认同)
  • IIF(仅需要SQLServerGTE2012支持,thisAnswer,theOtherAnswer) (2认同)

Cha*_*ana 117

使用案例:

   Select Case When @PaidThisMonth < @OwedPast 
               Then @PaidThisMonth Else @OwedPast End PaidForPast
Run Code Online (Sandbox Code Playgroud)

作为内联表值UDF

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

用法:

Select MinValue as PaidforPast 
From dbo.Minimum(@PaidThisMonth, @OwedPast)
Run Code Online (Sandbox Code Playgroud)

附录:这可能最适合仅处理两个可能的值,如果有两个以上,请考虑使用Values子句的Craig答案.


Cra*_*aig 98

使用CASE,IIF和UDF的解决方案是足够的,但在使用2个以上的比较值将问题扩展到一般情况时是不切实际的.SQL Server 2008+中的通用解决方案使用VALUES子句的奇怪应用程序:

SELECT
PaidForPast=(SELECT MIN(x) FROM (VALUES (PaidThisMonth),(OwedPast)) AS value(x))
Run Code Online (Sandbox Code Playgroud)

归功于本网站:http: //sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql-服务器叔sql.aspx

  • 这是最好的答案 (11认同)
  • Auspex,MartinC的回答是无关的.这个答案不使用工会. (4认同)

Mar*_*inC 28

我只是遇到了一种情况,我必须在更新中找到最多4个复杂选择.使用这种方法,您可以拥有任意多个!

您也可以使用aditional选择替换数字

select max(x)
 from (
 select 1 as 'x' union
 select 4 as 'x' union
 select 3 as 'x' union
 select 2 as 'x' 
 ) a
Run Code Online (Sandbox Code Playgroud)

更复杂的用法

 @answer = select Max(x)
           from (
                select @NumberA as 'x' union
                select @NumberB as 'x' union
                select @NumberC as 'x' union
                select (
                       Select Max(score) from TopScores
                       ) as 'x' 
     ) a
Run Code Online (Sandbox Code Playgroud)

我确信UDF具有更好的性能.


Gil*_*lin 16

对于MySQL或PostgreSQL,更好的方法是使用LEAST和GREATEST函数.

SELECT GREATEST(A.date0, B.date0) AS date0, 
       LEAST(A.date1, B.date1, B.date2) AS date1
FROM A, B
WHERE B.x = A.x
Run Code Online (Sandbox Code Playgroud)

两者都在这里描述:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html

  • @RobertoRodriguez 如果问题将 MySQL 或 PostgreSQL 标记为问题的一部分,那就最好了。这个问题是专门关于 tsql 的,所以这个答案根本没有帮助。 (4认同)
  • “GREATEST”和“LEAST”承诺[在 Sql2022 中可用](https://learn.microsoft.com/en-us/sql/t-sql/functions/tical-functions-least-transact-sql?view =azure-sqldw-latest),所以这个答案还早了 6 年多。;) (3认同)
  • 这不是 MSSQL 的答案 (2认同)

小智 11

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

SELECT (ABS(field) + field)/2 FROM Table
Run Code Online (Sandbox Code Playgroud)

如果field是否定则返回0 ,否则返回field.

  • 因此,要计算最小值(@ a,@ b),您可以使用:`SELECT @a - (ABS(@ a- @ b)+(@ a- @ b))/ 2` (3认同)

Mik*_*ole 5

使用CASE语句.

此页面中的示例B应该接近您要执行的操作:http:
//msdn.microsoft.com/en-us/library/ms181765.aspx

这是页面中的代码:

USE AdventureWorks;
GO
SELECT   ProductNumber, Name, 'Price Range' = 
      CASE 
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
         WHEN ListPrice < 50 THEN 'Under $50'
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
         ELSE 'Over $1000'
      END
FROM Production.Product
ORDER BY ProductNumber ;
GO
Run Code Online (Sandbox Code Playgroud)