2014-07-11 27 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

感謝您的解釋..很多向您學習,但路徑是未知的.. –