1

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

我用类似的东西在活动记录中尝试了这个MyModel.order("country_preferences LIKE ?", country),但是得到了一个 SQL 错误。执行这种排序的正确方法是什么?

更新(摘自评论):

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

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

4

4 回答 4

2

您的问题是 ActiveRecordorder不支持占位符,因此您必须?手动处理,叹息。像这样讨厌的东西应该让它去:

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

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

于 2013-06-12T20:39:38.337 回答
0

例如,如果我的变量是“西班牙”,那么我希望将具有“爱尔兰、西班牙、法国”之类的值的记录排序到关系的前面

为此,您需要一个案例陈述。在 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 行。

于 2013-06-12T20:34:03.000 回答
0

如果我的变量是“西班牙”,那么我希望将具有“爱尔兰、西班牙、法国”之类的值的记录排序到关系的前面。

在这种情况下,根据您的变量为值分配权重并按其排序。

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

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

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

于 2013-06-12T20:45:56.980 回答
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
于 2013-06-12T20:19:14.230 回答