SQL按类排序

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

这与我前面的问题类似。在SQL(使用ActiveRecord)中,是否有任何方法可以使用LIKE运算符对关系进行排序?例如,我正在查询一个关系,其中一列是一个长字符串,通常包含许多逗号分隔的值。我希望通过使用like将上述列的值与较小字符串匹配的记录排序到前面,从而对结果关系进行排序(例如,如果我的变量为“西班牙”,则我希望将值为“爱尔兰、西班牙、法国”的记录排序到关系的前面)

我在活动记录中尝试了类似于
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这就是为什么您必须小心地这样做,并使用数据库接口的引用/转义机制。有时你不得不用丑陋的方式去做,因为你仅有的数据库接口太有限,太简单,无法完成你需要做的事情。