我正在使用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语法来完成我尝试做的事情?
答案 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;
但是,我对这个解决方案并不完全满意。这似乎效率低下。