通过Ruby的SQL通配符

通过Ruby的SQL通配符,sql,ruby,regex,sqlite,Sql,Ruby,Regex,Sqlite,我正在尝试使用通配符或正则表达式,以便在使用Ruby编写的简单库目录程序从数据库检索信息时,为用户输入提供一定的余地 有问题的代码(如果存在精确匹配,则当前有效): 我正在使用SQLite 3。在SQLite终端中,我可以输入: SELECT * FROM books WHERE title LIKE 'Moby%' 或 并获取(假设有正确的条目): 在我的Ruby程序中,我找不出任何相应的方法来实现这一点 在此上下文中是否不能使用SQL%通配符?如果是这样,我需要在这里使用Ruby正则表达式

我正在尝试使用通配符或正则表达式,以便在使用Ruby编写的简单库目录程序从数据库检索信息时,为用户输入提供一定的余地

有问题的代码(如果存在精确匹配,则当前有效):

我正在使用SQLite 3。在SQLite终端中,我可以输入:

SELECT * FROM books WHERE title LIKE 'Moby%'

并获取(假设有正确的条目):

在我的Ruby程序中,我找不出任何相应的方法来实现这一点

在此上下文中是否不能使用SQL
%
通配符?如果是这样,我需要在这里使用Ruby正则表达式吗?处理这个问题的好方法是什么

(即使将
放在单引号(
“?”
)中,也会导致它在程序中不再工作。)

非常感谢您的帮助


(注意:我实际上只是试图修改《开始Ruby》(Peter Cooper)第9章中的示例代码。)

您给SQL的
LIKE
的模式只是一个带有可选模式字符的字符串。这意味着您可以在Ruby中构建模式:

$db.execute("SELECT * FROM books WHERE title LIKE ?", "%#{title}%")
或者字符串是否在SQL中工作:

$db.execute("SELECT * FROM books WHERE title LIKE '%' || ? || '%'", title)

请注意,LIKE的区分大小写取决于数据库,而SQLite的区分大小写,所以在尝试切换数据库之前,您不必担心这一点。不同的数据库有不同的处理方法,有些数据库有不区分大小写的LIKE,有些数据库有单独的ILIKE不区分大小写的LIKE版本,有些数据库让您自己规范化大小写。

您最后的方法对我来说是新事物。我从未想过我们可以像您所展示的那样编写…@ArupRakshit:
|
是标准的SQL字符串连接运算符。有些数据库让您使用
+
,有些数据库让您使用
concat
函数,但它们都在标准上趋同(如果在其配置中打开“注意标准SQL!”标志,甚至MySQL也开始起作用)。一个相似的模式毕竟只是一个字符串。谢谢——这正是我想要弄明白的。还没有意识到SQLite的LIKE是不区分大小写的(还没有解决这一部分),所以这也是很好的了解。可能有一个标志来控制LIKE的行为,但我不确定,它可能是一个编译时标志。当我关心可移植性(但是
String#downcase
当然不知道非ASCII码,所以我使用我自己的方法修补
String
)时,我倾向于
lower(title)比如?
“%{title.downcase}%”。
Title: Moby-Dick
Author: Herman Melville
Country: USA
$db.execute("SELECT * FROM books WHERE title LIKE ?", "%#{title}%")
$db.execute("SELECT * FROM books WHERE title LIKE '%' || ? || '%'", title)