SQL按类排序
这与我前面的问题类似。在SQL(使用ActiveRecord)中,是否有任何方法可以使用LIKE运算符对关系进行排序?例如,我正在查询一个关系,其中一列是一个长字符串,通常包含许多逗号分隔的值。我希望通过使用like将上述列的值与较小字符串匹配的记录排序到前面,从而对结果关系进行排序(例如,如果我的变量为“西班牙”,则我希望将值为“爱尔兰、西班牙、法国”的记录排序到关系的前面) 我在活动记录中尝试了类似于SQL按类排序,sql,ruby-on-rails,postgresql,activerecord,ruby-on-rails-3.2,Sql,Ruby On Rails,Postgresql,Activerecord,Ruby On Rails 3.2,这与我前面的问题类似。在SQL(使用ActiveRecord)中,是否有任何方法可以使用LIKE运算符对关系进行排序?例如,我正在查询一个关系,其中一列是一个长字符串,通常包含许多逗号分隔的值。我希望通过使用like将上述列的值与较小字符串匹配的记录排序到前面,从而对结果关系进行排序(例如,如果我的变量为“西班牙”,则我希望将值为“爱尔兰、西班牙、法国”的记录排序到关系的前面) 我在活动记录中尝试了类似于MyModel.order(“country\u preferences like?”,co
MyModel.order(“country\u preferences like?”,country)
,但得到了一个SQL错误。执行这种订购的正确方法是什么
更新(摘自评论):
使用PostgreSQL 9.1。此处的当前SQL错误:
5条记录所在国家的偏好=“爱尔兰、西班牙、法国”,5条记录所在国家的偏好=“爱尔兰、德国、法国”。给定一个特定的国家/地区,希望返回一个关系,其中国家/地区首选项字符串包含该国家/地区的记录被排序到最前面。不完全确定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
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
请注意,这不是一个有效的查询。order by子句基本上保证不会使用有效的索引来获取前10行。您的问题是ActiveRecord的
顺序
不支持占位符,因此您必须手动处理?
。像这样令人讨厌的事情应该会发生:
c = ActiveRecord::Base.connection.quote(country)
MyModel.order("country_preferences LIKE '%' || #{c} || '%'")
如果不想依赖布尔排序,可以将此与结合使用
如果我的变量是“西班牙”,那么我希望在关系的前面排序一个值为“爱尔兰、西班牙、法国”的记录
在这种情况下,根据变量为值指定权重并按其排序
DECLARE @test NVARCHAR(20) = '%Spain%'
SELECT Column1 ,
CASE WHEN Column1 LIKE @test
THEN 1
ELSE 0
END [Weight]
FROM Table
ORDER BY [Weight] DESC
如果不想显示“权重”列,请在此查询顶部创建一个子查询,并省略“权重”列。示例。示例输入、电流输出、所需输出。另外,给出您得到的SQL错误。5条记录,其中country_preference=“爱尔兰、西班牙、法国”,5条记录,其中country_preference=“爱尔兰、德国、法国”。给定一个特定的国家/地区,希望返回一个关系,其中其国家/地区首选项字符串包含此国家/地区的记录被排序到前面。当前的SQL错误可在此处找到:如果我没有弄错,这就是您想要的MyModel。where(“国家/地区首选项喜欢?”,“%\#{country}%”。order(“国家/地区首选项”)这是否不排除所有“country_preferences LIKE?”,“%{country}”返回false的记录?我想返回所有记录,只是将匹配的记录排在前面。AR不理解
中的占位符。order
,叹气。请记住,AR使用字符串篡改来处理占位符本身,实际上并不会将它们发送到database.Aye。应根据您自己的答案进行修正:-PAll数据库人员对AR的嘲笑和嘲笑(IMO)是当之无愧的。我使用它,但我发誓我会直接使用SQL。@muistooshort:fwiw,它并不比其他ORM差多少(Sequel是我所知道的唯一值得注意的例外)…:我已经编写了一些orm,它们也都是垃圾:)很晚才来到这里,但我要警告不要在数据库接口中插入字符串。它们有一个成为SQL注入向量的坏习惯。@RaySir这就是为什么您必须小心地这样做,并使用数据库接口的引用/转义机制。有时你不得不用丑陋的方式去做,因为你仅有的数据库接口太有限,太简单,无法完成你需要做的事情。