Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在TCL中,在sqlite in语句中使用一个变量_Sqlite_Tcl - Fatal编程技术网

在TCL中,在sqlite in语句中使用一个变量

在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语句中[…]任何合法放置字符串或数字

我想对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 (: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
}]