0

大家好,我必须进行查询以确定一个数字在 sql 表中所属的范围,我正在做的是使用 between 但是当您使用适用于最终值为 null 的最后一个范围的值时没有带来结果,我找到了一种解决方法,但我认为这不是最好的方法。下面是我正在尝试做的一个例子。

-- 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 来验证并为其分配值。

有没有其他方法可以解决这个问题。

4

2 回答 2

2

几个选项:

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
于 2013-10-09T18:21:37.007 回答
0

如果您坚持将其NULL作为最终值,那么不,一般来说,除了检查空值之外别无他法。

但你可以做

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

2147483647 是可能的最大整数。

编辑:但是,我刚刚注意到,即 302 将无法通过您的测试。

于 2013-10-09T18:22:54.693 回答