我想对sqlite数据库执行以下查询:
set LCs [ DB eval { SELECT DISTINCT LC FROM MyTable WHERE LC IN ( :InString ) } ]
这将产生所需的结果1 3 4
尝试以下操作会引发语法错误:
将InString设置为“ 1、3、4”
{{1}}
我以前使用:Varible 都没有问题,但是在这种情况下,由于花括号而导致失败。如何在SQLite IN语句中使用TCL变量?
答案 0 :(得分:4)
如果您需要将许多值从Tcl移到SQLite中以进行此类操作,请首先将它们放入:memory:
数据库中的临时表中,然后使用SQL操作将其从中删除在那里。
DB eval {
ATTACH DATABASE ':memory:' AS memdb;
CREATE TEMP TABLE memdb.values (val TEXT);
}
foreach val {1 3 4} {
DB eval {
INSERT INTO memdb.values (val) VALUES (:val)
}
}
set LCs [DB eval {
SELECT DISTINCT LC FROM MyTable WHERE LC IN memdb.values.val
}]
答案 1 :(得分:2)
根据文档:“ Tcl变量名可以出现在SQL语句中放置字符串或数字文字合法的任何位置。因此,您可以这样做:
set LCs [DB eval {SELECT DISTINCT LC FROM MyTable WHERE LC IN (:v1, :v2, :v3)}]
,但是您不能为完整列表使用变量。取而代之的是,您必须先构建字符串,然后再将其传递给DB eval
,或者创建一个函数来检查该值是否在列表中。
选项1:
set LCs [DB eval "SELECT DISTINCT LC FROM MyTable WHERE LC IN ($InString)"]
选项2:
proc check {val} {
global InString
return [expr {$val in $InString}]
}
db function search check
set LCs [DB eval {SELECT LC FROM MyTable WHERE search(LC)}]
对于选项#2,$ InString应该是普通的Tcl列表,因此不要用逗号分隔。