我有输入1,2和3。
如何选择这些值在一行中的记录?
Castling
如果需要速度,是否还需要索引col1-col3?
答案 0 :(得分:0)
你应该使用OR not和..如果你需要至少一个列匹配
SELECT *
from table
WHERE col1 in (1,2,3)
OR col2 in (1,2,3)
OR col3 in (1,2,3) ;
您的查询应该可以在所有列中使用值1,2,3
答案 1 :(得分:0)
在您的问题中标记您正在使用的DBMS。
话虽如此,假设您希望获得具有(1,2,3)列的任何顺序的列col1,col2,col3,即
。1 2 3
2 1 3
2 3 1
. . .
在Oracle,MySQL和Postgresql中,您可以这样做:
select *
from t
where (1, 2, 3) in (
(col1, col2, col3),
(col1, col3, col2),
(col2, col1, col3),
(col2, col3, col1),
(col3, col1, col2),
(col3, col2, col1)
);
答案 2 :(得分:0)
@Gurv有一个合理的解决方案,但你实际上想要逆。假设您的数据库支持此元组表示法,您可以执行以下操作:
select *
from t
where (col1, col2, col3) in ( (1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1) );
这种方法的优点是数据库可以使用(col1, col2, col3)
上的索引。
在其他数据库中,您可以使用相同的索引or
或union all
:
where (col1 = 1 and col2 = 2 and col3 = 3) or
(col1 = 1 and col2 = 3 and col3 = 2) or
. . .
在这种情况下,优化器应足够智能以使用索引。如果不是,您可以使用union
/ union all
select t.*
from t
where (col1 = 1 and col2 = 2 and col3 = 3)
union all
select t.*
from t
where (col1 = 1 and col2 = 3 and col3 = 2)
union all
. . .
答案 3 :(得分:0)
一种完全不同的方法,可以避免缓慢的“ where in” (但显然仅适用于数字字段)
select * from t where
max(col1, col2, col3) = max(1,2,3)
and
min(col1, col2, col3) = min(1,2,3)
and
col1+col2+col3 - max(col1, col2, col3)- min(col1, col2, col3)
= 1+2+3 - max(1, 2, 3) - min(1, 2, 3)