让SQLite表包含一个包含名称的列:
Names
ThingA_1
ThingF_1
ThingF_2
ThingB_1
ThingB_2
ThingB_3
ThingB_4
我想删除包含“ThingF_ *”的所有行 我可以使用Standard DELETE FROM命令遍历整个表:
DB eval { DELETE FROM 'MyTable' WHERE Names = 'ThingF_1' }
DB eval { DELETE FROM 'MyTable' WHERE Names = 'ThingF_2' }
我尝试了LIKE命令但没有成功(并且没有错误消息)
set Name ThingF_
DB eval { DELETE FROM 'MyTable' WHERE Names LIKE $Name }
我也试过
DB eval { DELETE FROM 'MyTable' WHERE Names LIKE '$Name%' }
答案 0 :(得分:1)
这几乎有效:
set Name ThingF_
DB eval { DELETE FROM 'MyTable' WHERE Names LIKE $Name }
唯一的问题是您传递了一个不匹配的模式,并且您希望匹配的_
是SQL LIKE
single-character wildcard。因此,您最好使用glob匹配(特定于SQLite的扩展,但这里是一个有用的扩展)。您可以使用:
set NamePattern "ThingF_*"
DB eval { DELETE FROM MyTable WHERE Names GLOB :NamePattern }
或(||
是SQL字符串连接运算符;如果要在SQL引擎中进行连接,则需要显式请求它,与Tcl不同):
set Name "ThingF_"
DB eval { DELETE FROM MyTable WHERE Names GLOB (:Name || '*') }
我已停止引用MyTable
作为字符串文字。如果您需要引用您的令牌名称,请使用"this"
或[this]
或`this`
,但绝对不是"this"
,它仅作为兼容性垫片使用,并且在良好的SQL中真的不鼓励码。另外,我已将$Name
切换为:Name
以获取命名参数;虽然SQL是括号,所以使用$Name
是完全可以的,它仍然感觉有点太接近等待发生的事故而且:Name
更明显是参数而不是标准Tcl变量(尽管默认情况下它是这样绑定的。)
答案 1 :(得分:0)
用户LIKE或GLOB):
... WHERE Names LIKE 'ThingF_%'
... WHERE Names GLOB 'ThingF_*'
只有GLOB区分大小写。