2010-08-17 3 views
1

다음은이 테이블의 테이블과 스크립트입니다. 최소 및 최대 범위에 속하는 테이블의 행을 찾습니다.

DECLARE @temp TABLE (PPId INT, SVPId INT, Minimum INT, Maximum INT) 

INSERT INTO @temp VALUES(1,1,8,20) 
INSERT INTO @temp VALUES(2,1,21,100) 

alt text

최소 & 최대

는 매개 변수로 전달됩니다. 주어진 범위에 속하는 모든 행을 찾고 싶습니다.

예;

  • @minimum = 9 @maximum = 15 후 처음 행의 범위에 해당하는 경우.
  • @minimum = 21 및 @maximum = 22 인 경우 두 번째 행의 범위에 속합니다.
  • @minimum = 7 및 @maximum = 25 이면 행의 범위에 해당하므로 두 행을 모두 반환해야합니다.

감사합니다.

+0

테이블의 범위는 겹치지 않을 것이라고 보장됩니까? – NullUserException

+0

예, 범위가 중복되지 않습니다. 사실 나는 이것을 보장하기 위해 이것을하고있다. – Kashif

+3

왜 '18 22'입력은 ​​'21 100'과 일치하지만 *'* 8 20 '이 아닌가? – AakashM

답변

3

이와 같은 범위를 비교할 때 범위가 겹치지 않는 경우를 찾는 것이 더 쉽습니다. 두 개의 범위가 겹치는 수있는 여러 가지 방법이 있습니다,하지만이 중복되지 않는 두 가지 방법이 있습니다 :

select * 
from @temp 
where not (@maximum < Minimum or @minimum > Maximum) 
+0

감사합니다. Guffa, 대단한 도움. – Kashif

2
SELECT * 
FROM @temp 
WHERE minimum <= @max 
     AND maximum >= @min 
+0

때로는 누군가가이 조합이 모든 조합을 포함한다는 사실을 인식하려고 시도 할 수 있습니다 (부분 중첩 및 전체 중/일부 제외). 같은 것을 올릴 예정이었습니다. –

+0

나는 이것이 내가 좋아하는 대답이라고 생각한다. –

+0

참고 : 최종 값은 포괄적이 아니라 포괄적으로 처리됩니다. 즉, 범위 8-20과 20-22는 겹치지 않습니다. – Guffa

0

내 제안 대답은 나도 뭔가 또는 누락하고있어 의심 그렇게 간단 질문이 완전하지 않습니까?

SELECT * 
FROM @temp 
WHERE Minimum < @Minimum 
    AND Maximum > @Maximum 
+0

이것은 부분 중첩이 아닌 @min 및 @max 범위와 완전히 겹치는 행을 찾습니다 (@min 또는 @max는 특정 행에 의해 정의 된 범위 내에 속합니다) –

0

나는 당신이하려는 것을 볼 수 있습니다. 최소/최대 범위가 제공 최대/최대 범위와 얼마나 겹치는 지 알고 싶습니다. 이것을 시도하십시오 :

SELECT * FROM @temp T 
WHERE @minimum BETWEEN T.minimum AND T.maximum 
OR  @maximum BETWEEN T.minimum AND T.maximum 
OR  T.minimum BETWEEN @minimum AND @maximum 
OR  T.maximum BETWEEN @minimum AND @maximum 

[@ 최소, @maximum] 간격으로 교차하는 모든 행을 반환해야합니다.

+0

이것은 내가 직접 선택한 것처럼 다른 것보다 길어집니다 실제 교차점을 찾고있는 내 자신의 C# 코드 (그리고 따라서 각 시나리오를 별도로 분해해야 함)가 아니라 교차로의 불리언 성공이 필요합니다. Guffa 및 Quassnoi의 다른 옵션은 교차가 비어 있는지 여부를 테스트 할 때 훨씬 좋습니다. –

관련 문제