2010-08-12 52 views
2

我遇到了一个非常有趣的问题..实际上完全丢失了。假设我有一个表值的范围,如:从SQL Server中的一系列行中选择一行

id.........From........To 
1..........0...........5 
2..........6...........10 
3..........11...........15 
4..........16...........29 

所以现在我有一个整数说@MyInt = 8,我想选择单行在这个整数在于在这个例子中,8来自6到10之间,所以应该选择行ID = 2

我显然不能做

select * from table where From < @MyInt AND To >= @MyInt 

,因为它会选择所有的行,因为所有的数字会更小和/或更大..

那么如何在这种情况下选择那一行呢?

非常感谢!

+0

我不需要准确的问答,我很喜欢挑战,所以即使你们可以告诉我如何去选择这个的基本想法..将是伟大的 – iamserious 2010-08-12 17:46:27

回答

4

使用:

SELECT t.* 
    FROM TABLE t 
WHERE @MyInt BETWEEN t.[from] AND t.to 

...作品,因为这两个标准在每行的基础需要得到满足,返回行 - 这是等同于:

SELECT t.* 
    FROM TABLE t 
WHERE @MyInt <= t.to 
    AND @MyInt >= t.[from] 

。 ..这很好,因为这些值是独占集合。 BETWEEN是ANSI标准,并且始终具有包容性 - Oracle,SQL Server,MySQL,PostgreSQL,SQLite都将返回相同的数据(假设类似的数据类型)。

如果你使用:

AND @MyInt > t.[from] 

...你永远不会捕捉行,其中的变量是相同的from值(即:0,6,11,16)。

+0

嗯...你的比较是倒退。它应该是<= @MyInt <= t.to – 2010-08-12 17:54:53

+0

@James Curran:更正,thx。 – 2010-08-12 17:56:27

+0

+1 - 更加明确的是,BETWEEN运算符总是包含给定的范围 – 2010-08-12 18:07:20

2

您认为该声明应该很好地工作:

select * from table where From < @MyInt AND To >= @MyInt 

我认为你是混乱的,并与UNION:

select * from table where From < @MyInt 
UNION 
select * from table where To >= @MyInt 

会给你所有的行,但是,您的发言只会给你行(行)满足这两个条件。

(实际上,它会想念这里@MyInt等于下限的情况下,它应该是:

select * from table where From <= @MyInt AND @MyInt <= To 

我也扭转状态,所以这个关系更加明显)

+0

+1:对于将返回OP期望看到的值的查询,虽然他们的实际查询不会。 – 2010-08-12 17:55:21