从数据库按字符串名称排序

Jes*_*ham 1 ruby sql postgresql ruby-on-rails

我将字符串变量存储在数据库中,"Abstain","Block","No"或"Yes".目前我正在使用一个ORDER BY position,而不是字母顺序,我想命令他们像:'阻止','不','弃权','是'.在Rails中有一个简单的方法吗?

我的确切代码是:

def self.unique_votes(motion)
  Vote.find_by_sql("SELECT * FROM votes a WHERE created_at = (SELECT MAX(created_at) as created_at FROM votes b WHERE a.user_id = b.user_id AND motion_id = #{motion.id}) ORDER BY a.position")
end
Run Code Online (Sandbox Code Playgroud)

注意:我正在使用Postgres SQL,我正在寻找一个可以在select语句中使用的解决方案谢谢!

Rik*_*kki 7

这是实现这一目标的方法之一.顺便说一句,执行此类操作的最佳方法是使用另一个名为table的表"Position"来标识表中的数字和外键"votes"以引用表的主键"Position".您还可以"Order""Position"表中命名另一列来存储这些数字并进行排序.你应该在插入时间做这些事情,而不是每次选择.

干杯

SELECT  *
,   Case    a.position
        When    'Block'     Then    0
        When    'No'        Then    1
        When    'Abstain'   Then    2
        When    'Yes'       Then    3
        Else    -1
    End                     As  Position_Value
    FROM    votes   a
    WHERE   created_at =    (
        SELECT  MAX(created_at) as  created_at
            FROM    votes   b
            WHERE   a.user_id   =   b.user_id
            AND motion_id   =   #{motion.id}
    )
    ORDER   BY  Position_Value
Run Code Online (Sandbox Code Playgroud)

如果它不能正常工作的任何方式!你可以尝试这个:

Select  *
    From    (
        SELECT  *
    ,   Case    a.position
            When    'Block'     Then    0
            When    'No'        Then    1
            When    'Abstain'   Then    2
            When    'Yes'       Then    3
            Else    -1
        End                     As  Position_Value
        FROM    votes   a
        WHERE   created_at =    (
            SELECT  MAX(created_at) as  created_at
                FROM    votes   b
                WHERE   a.user_id   =   b.user_id
                AND motion_id   =   #{motion.id}
        )
    )   As  Result
    ORDER   BY  Position_Value
Run Code Online (Sandbox Code Playgroud)

  • 如果您不需要该位置,可以将CASE权限放入ORDER BY. (2认同)