2017-02-11 101 views
0

我有一個輸入1,2和3SQL查詢:選擇記錄,其中3個值都在3列

如何選取這些值是連續記錄?

SELECT * 
FROM table 
WHERE col1 IN (1, 2, 3) 
    AND col2 IN (1, 2, 3) 
    AND col3 in (1, 2, 3) 

如果需要速度,是否還需要對col1-col3進行索引?

+0

你可以分享你分貝 –

+1

您使用哪種DBMS樣? – GurV

+0

也添加示例數據和所需結果 – GurV

回答

0

,如果你需要人至少一列匹配您應該使用與否和..

SELECT * 
    from table 
    WHERE col1 in (1,2,3) 
    OR col2 in (1,2,3) 
    OR col3 in (1,2,3) ; 

您查詢應該工作,你有值1,2,3之一中的所有列

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) 
); 
+0

感謝您的答案。我測試了古爾夫的代碼。 –

+0

是的,就是這樣。謝謝。我測試和它的作品。我將跟進新的問題和實際數據應用。 –

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 
. . . 
+0

我使用這個解決方案。謝謝 –