这与我之前提到的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字符串包含此国家/地区的记录将被排在前面。
答案 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
如果您不希望显示“权重”列,请在此查询之上创建一个子查询,并省略“权重”列。