如何在sqlite3批处理模式下将大量的id列表传递给where子句?

时间:2013-07-01 12:05:28

标签: sqlite

我有一大堆要在sqlite3中用于查询的ID。我可以在shell,perl或R中逐个循环,或者使用xargs或','连接进行巧妙的黑客攻击以便通过批处理查询以提高效率但是我想知道是否有直接加载的方法在临时表中执行文件或执行'where in([read file])。处理这种常见情况的标准方法是什么?

2 个答案:

答案 0 :(得分:2)

你的意思是命令行shell的sqlite3,对吗?

是的,可以选择在(临时)表格中以某种分隔格式加载文件。

create temporary table ids (id integer primary key);
.import ids.txt ids

ids.txt将每个ID分别放在另一行。如果要导入多个列,则必须事先使用.separator命令设置分隔符,但对于只有一列,它应该无关紧要。

请注意,integer primary key比任何其他列类型都快,因为它将rowid中的行id和sqlite存储表别名化为b-tree中的表。如果可以,请使用它。

答案 1 :(得分:0)

我带来了一个很大的一行解决方案:创建一串逗号分隔和引用的元素,然后管道到xargs。 xargs会在命令行中放置尽可能多的数量,并根据需要多次重复命令。

如果我在第二列中有我的元素的制表符分隔文件:

perl -lane ' push @x,$F[2]; END{ print join(", ",map{q{\"}.$_.q{\"}}@x)}' file.txt |\
xargs -t -I{}  sqlite3 -separator $'\t' -header database.db \
 'select *  from xtable where mycolumn in ('{}') and myothercolumn="foo" order by bar"