通过比较两个表找到范围

时间:2014-09-17 07:35:03

标签: sql oracle

我在数据库中有一个表为“EXPERIENCE RANGE”,其中包含行(我也可以根据需要编辑此表)

0
0.5
1
2
3
5
10
20

我有整数经验。我需要显示它所在的范围。

示例 - 对于8的经验,范围将是5 - 10

我需要编写一个sql查询。任何想法都会非常有用,因为我不熟悉SQL。

我无法对其进行硬编码。只需要从表中获取值。

3 个答案:

答案 0 :(得分:1)

假设您使用的是Oracle,以下查询可以与现有表一起使用:

SELECT
  ( SELECT MAX( value ) FROM experience_range WHERE value <= :search_value ) AS range_start,
  ( SELECT MIN( value ) FROM experience_range WHERE value >  :search_value ) AS range_end
FROM dual;

无需对值进行硬编码,也无需冗余地存储下限和上限。

答案 1 :(得分:0)

您可以使用CASE Expression执行此操作,语法为:

SELECT
CASE 
    WHEN experience >= 0 and experience <= 4 THEN '0-4'
    WHEN experience >= 5 and experience <= 10 THEN '5-10'
    .....
    ELSE 'No Range'
END as Range
FROM Table_Name

答案 2 :(得分:0)

如果你确实需要将范围存储在表格中,我个人建议改变范围表的结构(假设你能够),可能是这样的:

|--------------------------------------|
|ID|DESCRIPTION|LOWER_LIMIT|UPPER_LIMIT|
|1 |  0 - 0.5  |     0     |     0.5   |
|2 |  0.5 - 1  |    0.5    |      1    |
                    ...

然后你可以通过运行类似的东西来获得你的范围:

SELECT DESCRIPTION FROM [RANGES] WHERE <VALUE> >= LOWER_LIMIT AND <VALUE> < UPPER_LIMIT
编辑--Mikhail的答案也有效,定义查询本身的范围也是一个选项,可能更简单,只要您不需要从多个报告中获取这些范围。 (这需要单独编辑每个报告/查询)

编辑2 - 我发现你无法对范围进行硬编码,在这种情况下,上述情况最好。我可以问你为什么不能对它们进行硬编码吗?