我将字符串变量存储在数据库中,可以是“弃权”、“阻止”、“否”或"is"。目前,我正在使用 ORDER BY position
来获取这些信息,但是,我不想按字母顺序排列,而是像这样排列它们:'Block'、'No'、'Abstain'、'Yes'。在 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 语句中使用的解决方案谢谢!
最佳答案
这是实现此目的的方法之一。顺便说一句,做这样的事情的最好方法是有另一个名为 "Position"
的表,它通过一个数字和一个外键在 "votes"
中标识每个值> 表引用 "Position"
表的主键。您还可以在 "Position"
表中有另一个名为 "Order"
的列来存储这些数字并进行排序。您应该在插入时执行这些操作,而不是在每次选择时执行。
干杯
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
如果它不能正常工作,无论如何!你可以试试这个:
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
关于sql - 按数据库中的字符串名称排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12362872/