2016-06-20 11 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

이 특히 명확하지 않다 : 내가 제대로 해석하고있어 경우

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

그리고, 이것은 당신이 정말로 무엇을 찾고 있는지 수 있습니다. 원하는 결과의 예와 함께 작업중인 데이터 샘플을 제공하십시오. WHERE (mytable.colA> 1 AND mytable.colA <6) 또는 (mytable.colB> 1 AND mytable.colB <6) 범위보다 더 큰'>'및'<'를 사용하십시오 : –

+0

은 명확성을 위해 예제를 추가했습니다 ( – NotGaeL

+0

) ' –

답변

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

일반적인 방법은 임시 테이블을 설정하고 기본 테이블에서 조인하는 것입니다. 한 최대를 설정하는

간단한 방법은 지금과 같다 :이로

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 between mt.ColA and mt.ColB