2015-07-11 106 views
1

我想在我的Rails應用程序中執行SQL查詢。以下執行正常,因爲它正在尋找完全匹配:使用%和LIKE的Rails中的SQL查詢

connection.query("SELECT * 
        FROM test 
        WHERE y=#{connection.quote(name)} 
        ORDER BY x ASC") 

我想使用LIKE運算符來查找部分匹配項。在SQL它會是什麼樣子:

SELECT * FROM test WHERE y LIKE '%John%' ORDER BY x ASC

怎樣在我的紅寶石查詢做到這一點?我嘗試在幾個地方添加%,但它不起作用。我得到的錯誤,說我的查詢正在尋找的%'John'%代替'%John%'

connection.query("SELECT * 
        FROM test 
        WHERE y LIKE #{%connection.quote(name)%} 
        ORDER BY x ASC") 
+0

@spickermann我感謝你標記這一點,但對我來說,它似乎不像是同一個查詢結構。通過閱讀您標記的帖子,這讓我覺得我可能會錯誤地寫出我的查詢,或者可能更不恰當,不安全。你能夠重新打開這個問題,或者向我解釋我如何將你引用的答案應用於我將串連接起來的情況,以除去多餘的''(撇號) - 謝謝! – jdesilvio

回答

0

您需要引用前添加% S IN紅寶石:

connection.query("SELECT * 
        FROM test 
        WHERE y LIKE #{connection.quote('%' + name + '%')} 
        ORDER BY x ASC") 

connection.quote將增加單引號產生一個有效的SQL字符串文字,你想要得到的%小號字符串常量,因此Ruby的字符串連接connection.quote被稱爲之前

或者你可以做到這一點在SQL:

connection.query("SELECT * 
        FROM test 
        WHERE y LIKE '%' || #{connection.quote(name)} || '%' 
        ORDER BY x ASC") 

||是標準的SQL字符串連接運算符,你可能需要,如果你使用不數據庫使用concat函數或別的東西真的支持SQL。

你最好使用ActiveRecord接口,因爲spickermann暗示,但有時你需要手工完成,所以知道如何做是有用的。

1

你想:

connection.query("SELECT * 
        FROM test 
        WHERE y LIKE '%#{connection.quote(name)}%' 
        ORDER BY x ASC") 

請記住,Ruby的變量替換隻是替換#{FOO}與foo值,不多也不少。當您在括號內添加額外的%時,您要求Ruby評估%foo%,這不是有效的Ruby變量。

+0

這被評價爲'%'約翰'%''並拋出一個錯誤 – jdesilvio

5

由於您使用Rails無論如何我建議使用ActiveRecord's query interface而不是普通的SQL。

隨着ActiveRecord的查詢可以這樣寫:

Test.where("y LIKE ?", "%#{name}%").order(:x) 

你需要有一個ActiveRecord型號命名被配置爲使用命名test數據庫表Test(Rails的默認命名會tests),使這項工作:

# in app/models/test.rb 
class Test < ActiveRecord::Base 
    self.table_name = 'test' 
end 
+0

我真的很感謝你回答我的問題。在使用ActiveRecord時,直接查詢與我使用的安全性有什麼區別?還是有其他原因使用ActiveRecord? – jdesilvio