2013-10-09 1 views
0

안녕하세요 모두 제가 숫자가 SQL 테이블에 속하는 범위를 결정하기 위해 쿼리를 만들어야합니다. 내가하고있는 일은 사이를 사용하지만 값을 사용할 때입니다. 최종 값이 null 인 최종 범위에 적용되는 결과는 가져 오지 않지만 해결 방법을 찾았지만이 방법이 최선의 방법은 아니라고 생각합니다. 아래는 내가하려는 일의 예입니다.범위 테이블 내에서 숫자 위치를 식별하는 SQL 쿼리

-- Creando temporal 
CREATE TABLE #TMP 
(
    RangeID   INT 
    ,InitialValue INT NULL 
    ,FinalValue  INT NULL 
) 


-- Insertar valores 
INSERT INTO #TMP 
    ( RangeID, InitialValue, FinalValue ) 
VALUES 
    ( 1, 100, 200) 
    ,( 2, 201, 300) 
    ,( 3, 301, NULL) 


-- Verificando temporal 
SELECT * FROM #TMP 

-- Verificando los rangos 
SELECT 
    * 
FROM 
    #TMP 
WHERE 
    301 between  InitialValue 
    AND FinalValue 

--RETURNS NOTHING 

SELECT 
    * 
FROM 
    #TMP 
WHERE 
    301 between  InitialValue 
    AND isnull(FinalValue,301+1) 


--RETURNS THE DESIRED RESULT 

-- Borrando temporal 
DROP TABLE #TMP 

문제는 최종 값이 null 일 때 isnull을 사용하여 유효성을 검사하고 값을 할당해야한다는 것입니다.

이 문제에 접근하는 다른 방법이 있습니까? 옵션

+0

사용중인 특정 DBMS에 질문을 태그하십시오. – Barmar

+0

SQL Server 2008 R2를 사용하고 있습니다. –

+0

입력 값이 400 인 경우 원하는 결과가 있습니까? – Barmar

답변

2

커플 :

당신이 최종 값으로 NULL을 가지고 주장하는 경우
WHERE 301 between InitialValue AND isnull(FinalValue,9999) 
--Some value high enough to encompass all possible values 

WHERE 301 >= Initial Value AND (301 <= FinalValue OR FinalValue IS NULL) 
--Instead of between, use >= AND <=, and make exception for null upper limit 
0

, 다음 아니, 일반적으로 널 (null)에 대한 검사보다 다른 방법이 없다.

하지만 당신은 최대 정수 할 수있는

INSERT INTO #TMP 
    ( RangeID, InitialValue, FinalValue ) 
VALUES 
    ( 1, 100, 200) 
    ,( 2, 201, 300) 
    ,( 3, 301, 2147483647) 

2147483647을 할 수 있습니다.

편집 : 난 그냥 발견, 그러나, 즉 302 당신의 테스트를 실패합니다.