如何从特定表中查找特定行?

时间:2016-04-19 08:55:15

标签: sql oracle11g

我想根据用户提供的值从特定表中查找特定列的特定字段。不知道包含该特定列字段的值是什么。 要明确:

    Table1
   --------------
   | range|value|
   --------------
   | 100  |0    |   
   | 200  |2    |  
   | 300  |9    | 
   | 400  |15   |
   | 500  |20   |
   --------------

从表1中 如果用户提供的值介于0到100之间,那么结果将为0,
如果用户提供的值在101到200之间,那么结果将是2,
如果用户提供的值在201到300之间,那么结果将是9
等等。例如,如果用户提供的值为50,则结果为0,如果用户提供的值为499,则结果为20.

如果范围列值固定,那么我们可以使用BETWEEN函数或< =,> =运算符轻松找到结果。但是这里的范围列值是未知的。我怎么解决这个问题?

4 个答案:

答案 0 :(得分:1)

您可以使用ORDER BYROWNUM伪列的组合来仅选择最佳行:

select value from (
  select * 
    from table1
   where range >= :p_Range
  order by range
)
where rownum < 2

或者,您可以使用ROW_NUMBER()分析函数计算显式排序,并使用它来过滤结果:

select value from (
  select t.*, row_number() over (partition by 1 order by range) as rn 
    from table1 t
   where range >= :p_Range
  order by range
)
where rn = 1

答案 1 :(得分:0)

import signal

def signal_handler(signal, frame):
    # Do work
    # Thread cleanup
    # pickle program state
    # remove(pidfile) # as an example
    exit(0)

signal.signal(signal.SIGINT, signal_handler)

答案 2 :(得分:0)

使用公用表表达式生成上限和下限的略有替代方法,以便您可以使用BETWEEN条件:

WITH ranges AS (
    SELECT 
          LAG(range, 1, 0) OVER (ORDER BY range) AS lower
        , range AS upper
        , value
    FROM Table1
)
SELECT value 
FROM ranges
WHERE :rangeparameter BETWEEN lower AND upper;

答案 3 :(得分:0)

您可以使用分析函数LAG使用不同的方法:

select value from (
  select value, range, nvl(lag(range) over (order by range), -1) prev_range from table1
)
where :rangeparam between prev_range+1 and range;