我想根据用户提供的值从特定表中查找特定列的特定字段。不知道包含该特定列字段的值是什么。 要明确:
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函数或< =,> =运算符轻松找到结果。但是这里的范围列值是未知的。我怎么解决这个问题?
答案 0 :(得分:1)
您可以使用ORDER BY
和ROWNUM
伪列的组合来仅选择最佳行:
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;