SQL查询:选择记录,其中3个值在3列中

时间:2017-02-11 07:41:38

标签: sql

我有输入1,2和3。

如何选择这些值在一行中的记录?

Castling

如果需要速度,是否还需要索引col1-col3?

4 个答案:

答案 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)上的索引。

在其他数据库中,您可以使用相同的索引orunion 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)