2016-06-20 3 views
0

整数リストがcolumnAとcolumnBの整数値で定義された範囲内にあるテーブルからレコードを取得するにはどうすればよいですか?指定された整数のリストがcolumnAとcolumnBの間にあるレコードを選択するためのSQLクエリ

私は、列のペアで定義された範囲ではなく、列の値と比較してIN演算子について知っています。例えば

select * from mytable where mytable.colA in (1,3,5,6);はコーラのいずれかである1,3,5または6

は範囲のためにそのようなものがあり、すべてのレコードを取得するでしょうか?それとも私は好きですか必要があります。

select * from mytable where 1 between mytable.colA and mytable.colb OR 3 between mytable.colA and mytable.colb OR 5 between mytable.colA and mytable.colb OR 6 between mytable.colA and mytable.colb;

+0

これは特に明確ではありません。作業しているデータのサンプルと、必要な結果の例を提供してください。 –

+0

明瞭にするための例を追加しました – NotGaeL

+0

は、WHERE(mytable.colA> 1 AND mytable.colA <6)または(mytable.colB> 1 AND mytable.colB <6)の範囲よりも '>'と ' ' –

答えて

3

多分この方法:

select distinct mytable.* 
from mytable 
join (select 1 nr union all select 3 union all select 5 union all select 6) n 
    on n.nr between mytable.colA and mytable.colb 

アップデート:ただMariaDB(10.0.19)でテスト

と1M-行インデックス付きテーブルあなたの元のクエリは、より高速です。

+0

(あなたの更新について):興味深い。私は両方のソリューションをpostgres(colAとcolBの両方のインデックス)で試してみましたが、大きな違いは見つかりませんでした。とにかく定期的にリフレッシュされたマテリアライズド・ビューになるので、パフォーマンスは重要な問題ではありません。私は 'SELECT * FROM mytable WHERE colA、colB IN(value1、...、valueN)'のような非常に簡単なクエリを期待していましたが、 – NotGaeL

1

一般的な方法は、一時テーブルを設定し、これを使用してメインテーブルに参加させる方法です。 1セットアップを設定するための

簡単な方法はそうのようなものです:

DECLARE @TempList table (LookFor int not null) 

INSERT @TempList (LookFor) values 
    (1) 
,(3) 
,(5) 
,(6) 

これは表であるとして、あなたはそれを埋めるために照会ロジックを使用することができます。

次に、これをターゲットテーブルに追加します。

SELECT mt.* 
from myTable mt 
    inner join @TempList tl 
    on tl.LookFor = mt.ColA 

そして、私が正しく解釈していた場合、これはあなたが本当に探しているものかもしれません:上記のご例えば

SELECT mt.* 
from myTable mt 
    inner join @TempList tl 
    on tl.LookFor between mt.ColA and mt.ColB 
関連する問題