在TCL中,在sqlite in语句中使用一个变量
我想对sqlite数据库执行以下查询:在TCL中,在sqlite in语句中使用一个变量,sqlite,tcl,Sqlite,Tcl,我想对sqlite数据库执行以下查询: set LCs [ DB eval { SELECT DISTINCT LC FROM MyTable WHERE LC IN ( 1, 3, 4 ) } ] 这将产生预期的结果1 3 4 尝试以下操作会引发语法错误: 设置仪表“1、3、4” 我以前使用过:Varaible,没有任何问题,但在这种情况下,由于大括号,它可能会失败。如何在SQLite语句中使用TCL变量?根据文档:“TCL变量名称可以出现在SQL语句中[…]任何合法放置字符串或数字
set LCs [ DB eval { SELECT DISTINCT LC FROM MyTable WHERE LC IN ( 1, 3, 4 ) } ]
这将产生预期的结果1 3 4
尝试以下操作会引发语法错误:
设置仪表“1、3、4”
我以前使用过:Varaible,没有任何问题,但在这种情况下,由于大括号,它可能会失败。如何在SQLite语句中使用TCL变量?根据文档:“TCL变量名称可以出现在SQL语句中[…]任何合法放置字符串或数字文字的位置。”因此,您可以:
set LCs [DB eval {SELECT DISTINCT LC FROM MyTable WHERE LC IN (:v1, :v2, :v3)}]
但不能对完整列表使用变量。相反,您必须在将字符串传递给DB eval
之前构建该字符串,或者创建一个函数来执行检查该值是否在列表中
选项1:
选项2:
对于选项#2,$InString应该是一个普通的Tcl列表,所以不能用逗号分隔。如果您需要将许多值从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
}]
有趣的是,直到看到你的答案,我才知道
:内存:
。当然,我现在会考虑使用更多的,而不是像我正在使用的一样在数据库中使用临时表。使用SQLite 3.21.0,我得到:接近“值”:执行create temp table语句时出现语法错误,尽管我在该语句中没有看到正式错误..遵循此处给出的提示:建议的方法有效。
set LCs [DB eval "SELECT DISTINCT LC FROM MyTable WHERE LC IN ($InString)"]
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)}]
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
}]