2014-07-11 25 views
0

我想用一个通配符或正则表达式给用户输入提供一些方便,用Ruby编写的简单的图书馆目录程序从数据库检索信息。通过Ruby的SQL通配符

有问题的代码(其当前工作是否有精确匹配):

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正则表达式吗?处理这个问题的好方法是什么?

(即使投入单引号?'?')将导致其在程序不再工作。)

任何帮助是极大的赞赏。

(注:我基本上只是试图从第9章修改开始红宝石(彼得·库珀)示例代码)

回答

2

你给SQL的LIKE模式仅仅是一个可选的模式字符的字符串。这意味着,你可以建立在Ruby的模式:

$db.execute("SELECT * FROM books WHERE title LIKE ?", "%#{title}%") 

或做在SQL字符串工作:

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

注意,相似的情况下灵敏度取决于数据库,但SQLite的的是区分大小写的,所以你在您尝试切换数据库之前不必担心。不同的数据库有不同的处理方式,一些有不区分大小写的LIKE,一些有独立的ILIKE不区分大小写的LIKE版本,有些则让你自己规范化。

+0

你最后的做法对我来说是新事物。我从来没有想过我们可以按照你所显示的方式来写... –

+1

@ArupRakshit:'||'是标准的SQL字符串连接运算符。有些数据库让你使用'+',有些使你使用'concat'函数,但它们都在标准化(即使MySQL打开了“注意标准SQL!其配置)。一个LIKE模式毕竟只是一个字符串。 –

+0

感谢您的解释..很多向您学习,但路径是未知的.. –