如何使用Sqlite中的值列表填充CTE

时间:2014-11-11 15:35:16

标签: c sqlite

我正在使用SQLite并直接使用C.我有一个长度为N的C数组,我将其编译为具有以下格式的字符串:

'id1', 'id2', 'id3', ... 'id[N]'

我需要构建查询以执行几个包含与此id列表比较的操作,其中一个示例可能是......

SELECT id FROM tableX WHERE id NOT IN (%s);

...其中%s被我的ids数组的字符串表示替换。对于复杂的查询和N的高值,这显然会产生一些非常笨拙的查询,我想使用common-table-expressions来清理它们。我尝试过以下方法:

WITH id_list(id) AS
(VALUES(%s))
SELECT * FROM id_list;

这不起作用,因为SQLite期望我的字符串中的每个值都有一列。我的另一次失败尝试是

WITH id_list(id) AS
(SELECT (%s))
SELECT * FROM id_list;

但是这会在逗号处抛出语法错误。是否存在SQLite语法来完成我尝试做的事情?

2 个答案:

答案 0 :(得分:1)

SQLite支持多行的VALUES子句,因此您可以编写:

WITH id_list(id) AS (VALUES ('id1'), ('id2'), ('id3'), ...

但是,这并不比仅在IN中列出ID更有效。

您可以将所有ID写入临时表,但除非您已经衡量了性能提升,否则这没有意义。

答案 1 :(得分:0)

我发现的一个解决方案是重新格式化我的字符串,如下所示:

VALUES('id1') UNION VALUES('id2') ... UNION VALUES('id[N]')

然后,以下查询实现了所需的结果:

WITH id_list(id) AS
(%s)
SELECT * FROM id_list;

但是,我对这个解决方案并不完全满意。这似乎效率低下。