使用%和LIKE在Rails中进行SQL查询

时间:2015-07-11 03:27:12

标签: sql ruby-on-rails ruby

我正在尝试在我的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

我如何在Ruby查询中执行此操作?我尝试在几个地方添加%,但它不起作用。我收到的错误表明我的查询正在寻找%'John'%而不是'%John%'

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

3 个答案:

答案 0 :(得分:5)

因为你无论如何都使用Rails我建议使用ActiveRecord's query interface而不是普通的SQL。

使用ActiveRecord,查询可以这样写:

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

您需要一个名为ActiveRecord的{​​{1}}模型,该模型配置为使用名为Test的数据库表(Rails默认命名为test)来完成此工作:

tests

答案 1 :(得分:1)

你想:

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

请记住,Ruby变量插值只是将#{foo}替换为foo的值,不多也不少。当您在括号内添加额外的%时,您要求Ruby评估%foo%,这不是有效的Ruby变量。

答案 2 :(得分:0)

您需要在引用之前在Ruby中添加%

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

connection.quote将添加单引号以生成有效的SQL字符串文字,并且您希望获得<{1}} 里面的字符串文字,因此Ruby字符串连接在调用 %之前。

或者您可以在SQL中执行此操作:

connection.quote

connection.query("SELECT * FROM test WHERE y LIKE '%' || #{connection.quote(name)} || '%' ORDER BY x ASC") 是标准的SQL字符串连接运算符,如果您使用的数据库并不真正支持SQL,则可能需要使用||函数或其他内容。

您最好使用ActiveRecord界面spickermann建议,但有时您需要手动执行此操作,因此了解具体方法非常有用。