我正在尝试使用通配符或正则表达式来为用户输入提供一些余地,以便在用Ruby编写的简单库目录程序中从数据库中检索信息。
有问题的代码(如果完全匹配,目前可以使用):
puts "Enter the title of the book"
title = gets.chomp
book = $db.execute("SELECT * FROM books WHERE title LIKE ?", title).first
puts %Q{Title:#{book['title']}
Author:#{book['auth_first']} #{book['auth_last']}
Country:#{book['country']}}
我正在使用SQLite 3.在SQLite终端中,我可以输入:
SELECT * FROM books WHERE title LIKE 'Moby%'
或
SELECT * FROM books WHERE title LIKE "Moby%"
并得到(假设有正确的条目):
Title: Moby-Dick
Author: Herman Melville
Country: USA
我无法在我的Ruby程序中找出任何相应的方法。
在此上下文中是否无法使用SQL %
通配符?如果是这样,我需要在这里使用Ruby正则表达式吗?处理这个问题的好方法是什么?
(即使将?
放在单引号('?'
)中也会导致它不再适用于该程序。)
非常感谢任何帮助。
(注意:我基本上只是想修改 Beginning Ruby (Peter Cooper)第9章中的示例代码。)
答案 0 :(得分:2)
您为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,有些使您自己规范化案例。