2016-06-20 9 views
0

Как получить записи из моей таблицы, где любой из целых чисел находится в диапазоне, определяемом значениями столбца A и столбца B?SQL-запрос для выбора записей, где любой из заданного списка целых чисел находится между столбцом A и столбцомB

Я знаю об операторе 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 

Update:

Просто протестирована на 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 = mt.ColA 

И, если я правильно интерпретировать, это может быть то, что вы действительно ищете:

SELECT mt.* 
from myTable mt 
    inner join @TempList tl 
    on tl.LookFor between mt.ColA and mt.ColB 

 Смежные вопросы

  • Нет связанных вопросов^_^