多列SQL过滤

时间:2010-12-20 09:45:47

标签: sql mysql

我有一个MySql表,我想查询其中列在特定集合中的行。 例如,假设我的表格如下:

id | f1  | f2
-------------    
1  | 'a' | 20
2  | 'b' | 20
3  | 'a' | 30
4  | 'b' | 20
5  | 'c' | 20

现在,我希望提取(f1,f2)对的行('a',30)或('b',20),即行2,3, 4。我也希望使用'IN'样式过滤器,因为我可能有很多对要获取。如果我尝试这样的话:

SELECT * FROM my_table WHERE f1 IN ('a','b') AND f2 IN (30, 20)

我得到了在IN子句中为f1和f2指定的值的笛卡尔乘积,即f1 ='a'或'b'和f2 = 30,20的所有可能组合的行,因此第1行是也选择了。

简而言之,我需要这样的东西:

SELECT * FROM my_table WHERE (f1,f2) IN (('a',30), ('b',20))

仅使用有效的SQL语法: - )

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

有效的语法。

如果你不喜欢它,其他一些选择是:

SELECT * FROM my_table
WHERE (f1, f2) = ('a', 30)
OR    (f1, f2) = ('b', 20)

或使用联接:

SELECT *
FROM my_table T1
(
    SELECT 'a' AS f1, 30 AS f2
    UNION ALL
    SELECT 'b', 20
) T2
ON T1.f1 = T2.f1 AND T1.f2 = T2.f2

答案 1 :(得分:0)

SELECT * FROM my_table WHERE (f1= 'a' AND f2=30) OR (f1='b' AND f2=20);

答案 2 :(得分:0)

粗略但实用的方法是使用字符串连接:

SELECT *
FROM MyTable
WHERE CONCAT(f1, '_', f2) IN ('a_30', 'b_20')