2016-04-19 4 views
0

Я хочу найти конкретное поле определенного столбца из конкретной таблицы на основе предоставленного пользователем значения. Неизвестно, какое значение содержит это конкретное поле столбца. Для ясности:Как я могу найти определенную строку из конкретной таблицы?

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

От Table1
если это предусмотрено пользователю значение в диапазоне от 0 до 100, то результатом будет 0,
, если при условии, пользователь значение находится между 101 до 200, то результатом будет 2,
если пользователь предоставил значение от 201 до 300, тогда результат будет равен 9
и так далее. В качестве примера, если пользователь предоставил значение равным 50, тогда результат будет равен 0, если пользователь предоставит значения 499, тогда результат будет равен 20.

Если значение столбца диапазона фиксировано, мы можем легко найти результат с использованием функции BETWEEN или < =,> = оператор. Но здесь значение столбца диапазона неизвестно. Как я могу решить эту проблему?

+1

что, если пользователь выберет номер выше 500? – ninesided

ответ

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 
+0

@SCHmitt: Отлично! Готово. Большое спасибо. –

+0

Добро пожаловать. Если этот (или любой другой) ответ отвечает на ваш вопрос, пожалуйста, подумайте о его принятии (нажав кнопку проверки рядом с ним). –

0
select value 
from table1 
where range = (select min(range) from table1 
       where range >= :rangeparam) 
+0

_surely_ вы можете сделать это без вложенного запроса? – ninesided

+0

@ninesided, ну, вот как я интерпретировал вопрос. Есть ли у вас другая идея? – jarlh

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; 
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;