从TCL在sqlite IN语句中使用变量

时间:2018-09-12 09:13:06

标签: sqlite tcl

我想对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变量?

2 个答案:

答案 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列表,因此不要用逗号分隔。