我有一个包含显示范围的列的表,例如
id from to
1 10 100
2 200 300
我有一个查询,它将是一个值列表,如17,20,44,288等。
是否有可能包含where条件的结果集,所以我得到:
id from to input
1 10 100 7
1 10 100 20
1 10 100 144
2 200 300 288
现在代码每个值运行一个查询并且它可以工作,我希望通过将它组合成一个大的多个where子句来提高性能,比如
SELECT *
FROM table
WHERE (from<=7 AND start>=7)
OR (from<=20 AND start>=20)
OR (from<=144 AND start>=144)
OR (from<=288 AND start>=288)
答案 0 :(得分:1)
你想要什么对范围毫无意义。
7
和144
没有兼容的范围,但您想要放入第一个范围。
在包含大量值列表的结果集中,您可能会遇到很多条件。
您可以做的是将那些不在范围内的值放在没有对应的情况下显示。像这样:
结构为:
create table test (
id integer,
vfrom integer,
vto integer
);
insert into test values
(1, 10, 100),
(2, 200, 300);
create table vals(
val integer
);
insert into vals values (7), (20), (144), (288);
您可以使用此查询:
select val, id, vfrom, vto
from vals v left join
test t on ( t.vfrom <= v.val and t.vto >= v.val )
它会带给你:
7 null null null
20 1 10 100
144 null null null
288 2 200 300
在这里看小提琴:http://sqlfiddle.com/#!2/f68fd/8
也许它不是你想要的,但它更合乎逻辑。
答案 1 :(得分:0)
当然有一个查询。麻烦的是我们需要一个表格来显示具体的值;然后有子查询和联合选择:
SELECT table.*, values.val AS input
FROM (SELECT 7 AS val UNION SELECT 20 AS val UNION SELECT 144 AS val UNION SELECT 288 AS val) as values
JOIN table ON table.from <= values.val AND table.to >= values.val
这应该可以解决问题。请注意,您只需在SELECT
中的第一个UNION SELECT
中指定列名。
答案 2 :(得分:0)
我认为您使用Java作为应用程序语言。您可以这样构建查询:
public String buildQuery(int[] myList) {
String queryToReturn = "";
for (int queryIndex = 0; queryIndex < myList.length; queryIndex++) {
queryToReturn += ((queryIndex == 0) ? ("") : (" union ")) +
"(select `id`, `from`, `to`, " + myList[queryIndex] + " as input
from MyTable
where `from` < " + myList[queryIndex] + " and " + myList[queryIndex] " < `to`)";
}
return queryToReturn;
}
然后运行返回的查询。