2015-09-22 71 views
0

我需要帮助解决我的问题。 我有一个值存储在表中,并且值是一个范围。SQL Server中的范围类型参数

例如:

Category    Value 
-------------------- --------------------------- 
1     < 70 
2     > 70 - 90 
3     > 90 - 100 
4     > 100 - 120 
5     > 120 

所以,当我有一个值80,他在第2类

例如:

Value    Category 
-------------------- --------------------------- 
80     2 
75     2 
115     4 
50     1 
99     2 

如何最简单的方法来存储这个范围在表中键入参数,并且容易查询它?

预先感谢您

+0

检查CASE语句。 https://msdn.microsoft.com/en-us/library/ms181765.aspx和http://www.codeproject.com/Articles/39103/A-Simple-Use-of-SQL-CASE-Expression – Jeremy

+1

**列:**从,到| **查询:** CASE,BETWEEN, – DarkKnight

+0

可悲的是70不在任何范围内 – Eric

回答

1

我会这样设计呢。

CREATE TABLE CategoryRange(
    CategoryId INT IDENTITY(1, 1), 
    MinValue INT NULL, 
    MaxValue INT NULL 
) 

得到相应的类别:

注意范围被解释为value >= min AND value < max

DECLARE @values TABLE(value INT) 
INSERT INTO @values VALUES 
(80), (75), (115), (50), (99) 

SELECT 
    v.value, 
    r.CategoryId 
FROM @values v 
CROSS APPLY(
    SELECT CategoryId 
    FROM CategoryRange 
    WHERE 
     (MinValue IS NULL OR v.value >= MinValue) 
     AND (
      MaxValue IS NULL 
      OR v.value < MaxValue 
     ) 
)r 

SQL Fiddle

| value | CategoryId | 
|-------|------------| 
| 80 |   2 | 
| 75 |   2 | 
| 115 |   4 | 
| 50 |   1 | 
| 99 |   3 | 
+0

真是一个快速的答案!你救了我一天菲利克斯!非常感谢你的帮助。 – user1008497

1

添加到Felix的解决方案,如果范围是连续的,你可以有范围表的完美无瑕的设计

-- Accept only one value of range, RangeTo 
DECLARE @ContinuousRange table (CategoryId int identity(1,1), RangeTo int primary key) 
INSERT @ContinuousRange VALUES (70), (90), (100), (120) 
,(2147483647) -- Add this to the last entry for completing the range set 

-- Your table 
DECLARE @Values table (Value int) 
INSERT INTO @Values VALUES (80), (75), (115), (50), (99) 

-- Usage 
SELECT * 
FROM @Values v 
    OUTER APPLY 
    (
     SELECT TOP 1 * FROM @ContinuousRange WHERE v.value <= RangeTo 
     ORDER BY RangeTo 
    ) rng 
1

准备数据

Declare @category as table(categoryid int,fromvalue int, tovalue int) 
Declare @Value as table(value int) 

insert into @category values 
(1,NULL,70 ), 
(2,70 ,90 ), 
(3,90 ,100 ), 
(4,100, 120), 
(5,120,null) 

insert into @Value values 
(80), 
(75), 
(115), 
(50), 
(99) 

查询

SELECT v.value,c.categoryid 
FROM @category C INNER JOIN @Value V 
      on (v.value >=c.fromvalue or c.fromvalue is null) 
       and (v.value<=c.tovalue or c.tovalue is null)