SQL 查询选择任何给定整数列表位于 columnA 和 columnB 之间的记录
SQL query for selecting records where any of a given list of integers is between columnA and columnB
如何从我的 table 中获取任何整数列表在 columnA 和 columnB 整数值定义的范围内的记录?
我知道在与列值而不是一对列定义的范围进行比较时使用 IN 运算符。
例如:select * from mytable where mytable.colA in (1,3,5,6);
将获取所有 colA 为 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;
也许这样:
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) 和一个 100 万行的索引上进行了测试 table。您的原始查询要快得多。
一个常见的策略是设置一个临时 table,然后用它来加入您的主 table。
一种简单的设置方法如下:
DECLARE @TempList table (LookFor int not null)
INSERT @TempList (LookFor) values
(1)
,(3)
,(5)
,(6)
由于这是一个 table,您可以使用查询逻辑来填充它。
接下来,将其加入您的目标 table。对于上面的示例:
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
如何从我的 table 中获取任何整数列表在 columnA 和 columnB 整数值定义的范围内的记录?
我知道在与列值而不是一对列定义的范围进行比较时使用 IN 运算符。
例如:select * from mytable where mytable.colA in (1,3,5,6);
将获取所有 colA 为 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;
也许这样:
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) 和一个 100 万行的索引上进行了测试 table。您的原始查询要快得多。
一个常见的策略是设置一个临时 table,然后用它来加入您的主 table。
一种简单的设置方法如下:
DECLARE @TempList table (LookFor int not null)
INSERT @TempList (LookFor) values
(1)
,(3)
,(5)
,(6)
由于这是一个 table,您可以使用查询逻辑来填充它。
接下来,将其加入您的目标 table。对于上面的示例:
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