我对SQL还很陌生。我想这很简单,但我一直没能在网上找到一个简单的答案。
我正在编写一个简单的SQL查询,通过枚举列对数据库记录进行分组,并显示每个值的计数。它工作正常,但输出显示的是枚举整数,我希望它显示该枚举值的字符串键。
下面是SQL查询的一个示例:
SELECT COUNT(a.sound) as "Sound Count", a.sound
FROM animals a
GROUP BY a.sound
以下是枚举定义:
enum sound: {
bark: 0,
meow: 1,
moo: 2
}
这是查询的输出:
Sound Count Sound
2 0
4 1
3 2
而我真正想要的是:
Sound Count Sound
2 bark
4 meow
3 moo
您正在使用SQL向DB询问信息,因此它对您的Rails枚举没有任何了解。您需要使用Rails进行查询:
Animals.all.group(:sound).count(:sound)
=> {"bark"=>2, "meow"=>4, "moo"=>3}
对于Postgresql:的纯sql答案
SELECT temp.sound_count,
CASE
when temp.sound = 0 then 'bark'
when temp.sound = 1 then 'meow'
when temp.sound = 2 then 'moo'
END
AS my_sound
FROM (SELECT COUNT(s.sound) as sound_count, a.sound from animals a
GOUP BY a.sound)
AS temp;
如果您不使用遗留数据库,并且能够更改模式,那么我建议不要使用整数支持的枚举。使用字符串支持的枚举将使数据库在没有应用程序代码的情况下可读。然后,当您向代码中添加新值时,不需要记录整数的含义。
与其像您那样定义枚举,不如将其定义为字符串:
enum sound: {
bark: 'bark',
meow: 'meow',
moo: 'moo'
}
并确保数据库中的列也是一个字符串。
现在,您可以获得enum的所有好处,而无需在数据库中使用整数。您的查询也将按原样运行,并生成您要求的结果。
只要列被索引,查询的速度基本上和整数一样快。它只需要再占用几个字节的空间。
如果您想在数据库级别强制执行值,还可以考虑使用postgres枚举。