通过Ruby的SQL通配符

时间:2014-07-11 05:44:37

标签: sql ruby regex sqlite

我正在尝试使用通配符或正则表达式来为用户输入提供一些余地,以便在用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章中的示例代码。)

1 个答案:

答案 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,有些使您自己规范化案例。