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

时间:2012-09-11 04:41:16

标签: sql ruby-on-rails ruby postgresql

我将字符串变量存储在数据库中,“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

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

4 个答案:

答案 0 :(得分:7)

这是实现这一目标的方法之一。顺便说一句,执行此类操作的最佳方法是使用另一个名为"Position"的表,该表通过"votes"表中的数字和外键标识每个值,以引用{{{}的主键。 1}}表。您还可以在"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

答案 1 :(得分:4)

每当我有一个系列我需要排序成一个不自然的顺序时,我会添加一个额外的整数字段,并将值放入其中,这将强制字符串值为我想要的任何顺序。

而不仅仅是:

'Abstain'
'Block'
'No'
'Yes'

我有第二个字段:

'Abstain' 3
'Block'   1
'No'      2
'Yes'     4

第二列的排序允许我按照我想要的顺序检索值:

'Block'   1
'No'      2
'Abstain' 3
'Yes'     4

答案 2 :(得分:2)

如果这是永久性要求,您可以将它们存储在另一个表中,其中包含另一个“排序”列,其中包含要按所需顺序打印它们的数字,使用此表加入结果并按订购列加入ORDER BY。

如果这是一个临时的,您可以将结果与UNION一堆SQL语句结合起来,这些SQL语句选择值和顺序,然后按排序列排序。

答案 3 :(得分:0)

您可以定义MySQL的FIELD函数,即对数组进行索引查找,然后将其用于ORDER BY。它比数组更简洁。

请参阅:https://stackoverflow.com/a/12366184/398670