如何使用通配符选择表colums

时间:2017-12-08 13:57:59

标签: sqlite tcl

让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%' }

2 个答案:

答案 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区分大小写。