2016-04-19 25 views
0

私は特定のテーブルから特定の列の特定のフィールドをユーザーが指定した値に基づいて検索したいと考えています。特定の列フィールドがどの値に含まれているかは不明です。特定のテーブルから特定の行を検索するにはどうすればよいですか?

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

表1
からユーザ提供の値がもたらす、次いで0〜100の間にある場合、ユーザー提供の値が200から101までの間である場合、結果0、
あろうが2、
あろう。明確にする ユーザー提供値が201〜300の場合、結果は9
となります。ユーザ提供の値は499は、次にレンジ列の値が固定されている場合、我々は容易に又は< =、> =関数との使用の結果を見つけることができる20

あろう結果である場合の例として、ユーザ提供の値は50は、その後、0であろう結果れている場合オペレーター。しかしここでは列の値の範囲は不明です。どうすればこの問題を解決できますか?

+1

ユーザーが500を超える数を選択した場合どのような? – ninesided

答えて

1

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

を、あなたはROW_NUMBER()分析関数を使用して明示的な順序付けを計算し、にそれを使用することができます結果をフィルタリングします。

+0

@SCHmitt:素晴らしい!完了しました。どうもありがとう。 –

+0

ようこそ。この(または他の)回答があなたの質問に答える場合は、それを受け入れることを検討してください(その隣のチェックボタンをクリックしてください)。 –

0
あなただけの最高の行を選択し ORDER BYの組み合わせと ROWNUM擬似列を使用することができます
select value 
from table1 
where range = (select min(range) from table1 
       where range >= :rangeparam) 
+0

_surely_ネストしたクエリなしでこれを行うことはできますか? – ninesided

+0

@nidesided、まあ、これは私が質問を解釈する方法です。あなたは他の考えを持っていますか? – jarlh

0

共通のテーブル式を使用して上部と下部を生成する方法Rの境界あなたは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; 
関連する問題