如何在sqlite中执行具有多个列的IN查询

时间:2013-08-21 16:48:17

标签: sql sqlite

我需要获取数据库中特定行的列,这些行由多个列标识。我想使用IN查询批量执行此操作。

在单列案例中,很容易:

SELECT id FROM foo WHERE a IN (1,2,3,4)

但是当我尝试多列

时,我遇到语法错误
SELECT id FROM foo WHERE (a,b) IN ((1,2), (3,4), (5,6))

有没有办法做到这一点?我不能只做两个IN子句,因为它可能会返回额外的行,也不会使用多列索引。

4 个答案:

答案 0 :(得分:2)

这是Declan_K的想法:
为了能够使用多列索引而不必更新单独的列,您必须将查找值放入可以加入的表中:

CREATE TEMPORARY TABLE lookup(a, b);
INSERT INTO lookup VALUES ...;
CREATE INDEX lookup_a_b ON lookup(a, b);
SELECT id FROM foo JOIN lookup ON foo.a = lookup.a AND foo.b = lookup.b;

(索引不是必需的;如果省略它,SQLite查询优化器将被强制查找lookup表中的foo记录,而不是反过来做。)

如果要避免临时表,可以使用子查询动态构造它:

SELECT id
FROM foo
JOIN (SELECT 1 AS a, 2 AS b UNION ALL
      SELECT 3     , 4      UNION ALL
      SELECT 5     , 6               ) AS lookup
 ON foo.a = lookup.a
AND foo.b = lookup.b

这仍然可以使用foo(a,b)上的索引。

答案 1 :(得分:1)

我认为您真正想要的是包含键/值对的另一个(字符串)列,以便您可以专门查询该组合。类似的东西:

SELECT id FROM foo WHERE c IN ('1,2', '3,4', '5,6')

您可以使用以下内容填充新列:

UPDATE foo SET c = a||','||b

答案 2 :(得分:1)

此命令应使用(a,b)上的索引:

 SELECT id FROM foo WHERE a = 1 and b = 2
 UNION ALL
 SELECT id FROM foo WHERE a = 3 and b = 4
 UNION ALL
 SELECT id FROM foo WHERE a = 5 and b = 6

如果您有一对长度列表,那么编写是很繁琐的,但这可以自动完成。

答案 3 :(得分:0)

您可能需要将a和b转换为字符串,但完成后,连接就是答案。

SELECT id FROM foo WHERE a||'_'||b IN ('1_2', '3_4', '5_6')