Как я могу отобразить строковый ключ перечисления вместо целочисленного значения в запросе SQL? - PullRequest
1 голос
/ 21 апреля 2020

Я довольно новичок в SQL. Я предполагаю, что это довольно просто, но я не смог найти прямой ответ в Интернете.

Я пишу простой запрос SQL, чтобы сгруппировать записи базы данных по столбцу enum и отобразить счетчик каждого значения. Это работает нормально, но вывод отображает целое число перечисления, где я хочу, чтобы он отображал строковый ключ этого значения перечисления.

Вот пример запроса 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

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Вы запрашиваете у БД информацию, используя SQL, и поэтому она не будет иметь никаких сведений о ваших перечислениях в Rails. Вам нужно использовать Rails, чтобы сделать запрос:

Animals.all.group(:sound).count(:sound)

=> {"bark"=>2, "meow"=>4, "moo"=>3}

Для чистого sql ответа с Postgresql:

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;
0 голосов
/ 21 апреля 2020

Если вы не работаете с устаревшей базой данных и можете изменить схему, я бы посоветовал не использовать перечисление с целочисленной поддержкой. Использование перечисления на основе строки сделает вашу базу данных читаемой без кода приложения. Затем, когда вы добавляете новые значения в ваш код, вам не нужно документировать, что означают целые числа.

Вместо того, чтобы определять перечисление, как вы, определите его как строки:

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

И убедитесь, что столбец в базе данных также является строкой.

Теперь вы получаете все преимущества enum без хлопот с целыми числами в базе данных. Ваш запрос также будет работать как есть и давать результат, который вы запрашивали.

Пока столбец проиндексирован, запрос в целом так же быстр, как и целое число. Это займет всего несколько байт пространства.

Если вы хотите применить значения на уровне базы данных, можно также рассмотреть перечисление postgres.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...