SQL ORDER BY LIKE

时间:2013-06-12 19:49:15

标签: sql ruby-on-rails postgresql activerecord ruby-on-rails-3.2

这与我之前提到的here问题相似。在SQL(使用ActiveRecord)中是否有任何方法可以使用LIKE运算符来订购关系?例如,我正在查询一个关系,其中一列是一个长字符串,通常包含许多逗号分隔值。我想通过在前面排序上述列的值使用LIKE匹配较小字符串的记录来命令结果关系(例如,如果我的变量是“西班牙”,那么我想要一个像“爱尔兰”这样的值的记录西班牙,法国“被命令到关系的前面。”

我在MyModel.order("country_preferences LIKE ?", country)之类的活动记录中尝试了这个,但是出现了SQL错误。执行此类排序的正确方法是什么?

更新(摘自评论):

使用PostgreSQL 9.1。此处的当前SQL错误:http://pastie.org/8037147

其中country_preference =“爱尔兰,西班牙,法国”的5条记录,其中country_preference =“爱尔兰,德国,法国”的5条记录。给定一个特定的国家/地区,想要返回一个关系,其中country_preferences字符串包含此国家/地区的记录将被排在前面。

4 个答案:

答案 0 :(得分:2)

您的问题是ActiveRecord的order不支持占位符,因此您必须手动处理?,感叹。像这样令人讨厌的东西应该让它成为现实:

c = ActiveRecord::Base.connection.quote(country)
MyModel.order("country_preferences LIKE '%' || #{c} || '%'")

如果您不想依赖布尔排序,可以将其与Goat_CO's CASE结合使用。

答案 1 :(得分:0)

不完全确定SQL答案是否有用,但您可以在订单中使用CASE语句,您的问题并不清楚必要的标准,但这可能会有所帮助:

SELECT *
FROM table
ORDER BY CASE WHEN country_preference LIKE '%Ireland%' THEN 1
              WHEN country_preference LIKE '%Spain%' THEN 2
              WHEN country_preference LIKE '%France%' THEN 3
              ELSE 4
          END

答案 2 :(得分:0)

  

e.g。如果我的变量是“西班牙”,那么我想要一个像“爱尔兰,西班牙,法国”这样的值的记录被命令到关系的前面

你需要一个案例陈述。它可能在Rails中看起来像这样:

MyModel.order("CASE WHEN country LIKE '%' || ? || '%' THEN 0 ELSE 1 END", country)

虽然我老实说不是100%对后者。但是,SQL应该如下所示:

select ...
from ...
where ...
order by case
         when country like '%Spain%' then 0
         else 1
         end

请注意,这是 NOT 一个有效的查询。 order by子句基本上保证不会使用有效的索引来获取前10行。

答案 3 :(得分:0)

  

如果我的变量是“西班牙”,那么我想要一个像“爱尔兰,西班牙,法国”这样的值的记录被命令到关系的前面。

在这种情况下,根据您的变量和ORDER为它们赋值。

 DECLARE @test NVARCHAR(20) = '%Spain%'

SELECT Column1 ,
       CASE WHEN Column1 LIKE @test
            THEN 1
            ELSE 0 
       END [Weight]
FROM Table
ORDER BY [Weight] DESC

如果您不希望显示“权重”列,请在此查询之上创建一个子查询,并省略“权重”列。