답변:
사용 사례 :
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의 답 을 고려하십시오 .
SQL Server 2012 및 2014는 IIF (cont, true, false) 기능을 지원합니다. 따라서 최소한의 선택을 위해 다음과 같이 사용할 수 있습니다
SELECT IIF(first>second, second, first) the_minimal FROM table
IIF 는 글쓰기의 짧은 축약 형 이지만 작성 CASE...WHEN...ELSE
하기가 더 쉽습니다.
CASE, IIF 및 UDF를 사용하는 솔루션이 적합하지만 두 개 이상의 비교 값을 사용하여 문제를 일반적인 경우로 확장 할 때는 비실용적입니다. SQL Server 2008+의 일반화 된 솔루션은 VALUES 절의 이상한 응용 프로그램을 사용합니다.
SELECT
PaidForPast=(SELECT MIN(x) FROM (VALUES (PaidThisMonth),(OwedPast)) AS value(x))
이 웹 사이트로 인한 크레딧 : http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql- server-t-sql.aspx
MIN(x*(case x when 0 then null else 1 end))
방금 업데이트 내에서 최대 4 개의 복잡한 선택을 찾아야하는 상황이있었습니다. 이 방법을 사용하면 원하는만큼 가질 수 있습니다!
숫자를 추가 선택으로 바꿀 수도 있습니다
select max(x)
from (
select 1 as 'x' union
select 4 as 'x' union
select 3 as 'x' union
select 2 as 'x'
) a
더 복잡한 사용법
@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
UDF의 성능이 더 좋다고 확신합니다.
MySQL 또는 PostgreSQL 9.3+의 경우 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
와:
GREATEST(value [, ...])
: 제공된 값에서 가장 큰 (최대 값) 인수를 리턴합니다.LEAST(value [, ...])
제공된 값에서 가장 작은 (최소값) 인수를 반환합니다설명서 링크 :
maximum (field, 0)을 계산하려는 경우 다음과 같은 트릭이 있습니다.
SELECT (ABS(field) + field)/2 FROM Table
field
음수 이면 0을 , 그렇지 않으면 0을 반환 field
합니다.
SELECT @a - ( ABS(@a-@b) + (@a-@b) ) / 2
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
임시 테이블을 사용하여 값 범위를 삽입 한 후 스토어드 프로 시저 또는 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
이것은 최대 5 개의 날짜에 작동하며 널을 처리합니다. 인라인 함수로 작동하지 못했습니다.
CREATE FUNCTION dbo.MinDate(@Date1 datetime = Null,
@Date2 datetime = Null,
@Date3 datetime = Null,
@Date4 datetime = Null,
@Date5 datetime = Null)
RETURNS Datetime AS
BEGIN
--USAGE select dbo.MinDate('20120405',null,null,'20110305',null)
DECLARE @Output datetime;
WITH Datelist_CTE(DT)
AS (
SELECT @Date1 AS DT WHERE @Date1 is not NULL UNION
SELECT @Date2 AS DT WHERE @Date2 is not NULL UNION
SELECT @Date3 AS DT WHERE @Date3 is not NULL UNION
SELECT @Date4 AS DT WHERE @Date4 is not NULL UNION
SELECT @Date5 AS DT WHERE @Date5 is not NULL
)
Select @Output=Min(DT) FROM Datelist_CTE
RETURN @Output
END
mathematix와 scottyc의 훌륭한 논리 / 코드를 바탕으로 다음을 제출합니다.
DECLARE @a INT, @b INT, @c INT = 0
WHILE @c < 100
BEGIN
SET @c += 1
SET @a = ROUND(RAND()*100,0)-50
SET @b = ROUND(RAND()*100,0)-50
SELECT @a AS a, @b AS b,
@a - ( ABS(@a-@b) + (@a-@b) ) / 2 AS MINab,
@a + ( ABS(@b-@a) + (@b-@a) ) / 2 AS MAXab,
CASE WHEN (@a <= @b AND @a = @a - ( ABS(@a-@b) + (@a-@b) ) / 2)
OR (@a >= @b AND @a = @a + ( ABS(@b-@a) + (@b-@a) ) / 2)
THEN 'Success' ELSE 'Failure' END AS Status
END
scottyc의 MIN 함수에서 MAX 함수로의 점프는 분명했지만, 해결되지 않았으며 여기에 포함 시켰습니다. SELECT @a + (ABS (@ b- @ a) + ( @ b- @ a)) / 2. 무작위로 생성 된 숫자는 증거는 아니지만 적어도 회의론자들에게 두 공식이 모두 정확하다는 것을 설득해야합니다.