【问题标题】:How can I display enum string key instead of integer value in SQL query?如何在 SQL 查询中显示枚举字符串键而不是整数值?
【发布时间】:2020-04-21 17:37:45
【问题描述】:

我对 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 ruby-on-rails enums


    【解决方案1】:

    您正在使用 SQL 向数据库询问信息,因此它不会了解您的 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;
    

    【讨论】:

    • 您可以在 SQL 中执行此操作,但您必须使用某种逻辑,例如“if..”来将数字转换为名称。
    • 谢谢,我是在 Heroku 数据剪辑中执行此操作的,所以不幸的是它需要在 SQL 中。我想只是将映射放入查询中并不算太糟糕,我只是希望如果我添加枚举值而不必记得在此处更新它。
    • 您的后端 Postgres 也是如此吗?了解哪种风味 DB 会有所帮助。
    • @Matt 您可以创建一个animal_sounds 表(以及rails 中的相关对象),这将使将来的修改更容易,并允许更好的关系查询,而无需全面了解非基于数据库的逻辑
    • 是的,后端是 Postgres。感谢@engineersmnky 的建议,可以考虑
    【解决方案2】:

    如果您不是在使用旧数据库并且能够更改架构,那么我建议您不要使用整数支持的枚举。使用字符串支持的枚举将使您的数据库在没有应用程序代码的情况下可读。然后,当您向代码中添加新值时,您无需记录整数的含义。

    不要像你那样定义枚举,而是将其定义为字符串:

    enum sound: {
      bark: 'bark',
      meow: 'meow', 
      moo: 'moo'
    }
    

    并确保数据库中的列也是字符串。

    现在您可以获得枚举的所有好处,而无需在数据库中处理整数问题。您的查询也将按原样工作并产生您要求的结果。

    只要列被索引,基本上就和查询整数一样快。它只会多占用几个字节的空间。

    如果您想在数据库级别强制执行值,也可以考虑使用 postgres 枚举。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多