Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于标识范围表中数字位置的SQL查询_Sql_Sql Server 2008 R2 - Fatal编程技术网

用于标识范围表中数字位置的SQL查询

用于标识范围表中数字位置的SQL查询,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,大家好,我必须做一个查询来确定一个数字在sql表中所属的范围,我正在做的是使用一个介于之间的值,但是当您使用一个应用于最后一个范围的值,其中最终值为null时,它不会产生结果,我找到了一个解决方法,但我认为这不是最好的方法。下面是我试图做的一个例子 -- Creando temporal CREATE TABLE #TMP ( RangeID INT ,InitialValue INT NULL ,FinalValue INT NULL )

大家好,我必须做一个查询来确定一个数字在sql表中所属的范围,我正在做的是使用一个介于之间的值,但是当您使用一个应用于最后一个范围的值,其中最终值为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来验证并为其赋值

是否有其他方法解决此问题。

两个选项:

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
其中301在InitialValue和isnull之间(FinalValue,9999)
--某些值高到足以包含所有可能的值

其中301>=初始值和(301=和如果坚持将
NULL
作为最终值,则通常没有其他方法,只能检查NULL

但你可以做到

INSERT INTO #TMP
    (   RangeID, InitialValue, FinalValue   )
VALUES
    (   1, 100, 200 )
    ,(  2, 201, 300 )
    ,(  3, 301, 2147483647 )
2147483647是可能的最大整数


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

请用您正在使用的特定DBMS标记您的问题。我使用的是sql server 2008 R2,如果输入值为400,您希望得到什么结果?结果应该是该值属于数字范围3,因为我想在tha中使用nullt范围表示大于301的任何值