SQL select replace integer со строкой

Цель заключается в замене целочисленного значения, которое возвращается в SQL-запросе с помощью значения char, которое представляет число. Например:

Атрибут таблицы, обозначенный как "Спорт", определяется как целое число от 1 до 4. 1 = Баскетбол, 2 = Хоккей и т.д. Ниже приведена таблица базы данных, а затем желаемый результат.

Таблица базы данных

Player     Team     Sport
--------------------------
Bob        Blue     1
Roy        Red      3
Sarah      Pink     4 

Желаемые выходы:

Player     Team     Sport
------------------------------
Bob        Blue     Basketball
Roy        Red      Soccer
Sarah      Pink     Kickball

Что лучше всего перевести эти целочисленные значения для значений String? Использовать SQL для перевода значений до передачи в программу? Использовать язык сценариев для изменения значения внутри программы? Изменить структуру базы данных?

Ответы

Ответ 1

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

Итак, у вас должна быть таблица, которая говорит список людей

Идентификатор имени FavSport
1 Alex 4
2 Комары 2

А затем еще одна таблица со списком спортивных состязаний

ID Спорт
1 Баскетбол
2 Футбол
3 Футбол
4 Кикбол

Затем вы сделаете соединение между этими таблицами

select people.name, sports.sport 
from people, sports 
where people.favsport = sports.ID

который вернет вас назад

Название Спорт
Алекс Кикбол
Gnat Football

Вы также можете использовать оператор case, например. просто используя таблицу людей сверху, вы можете написать что-то вроде

select name, 
       case 
         when favsport = 1 then 'Basketball' 
         when favsport = 2 then 'Football' 
         when favsport = 3 then 'Soccer' 
         else 'Kickball' 
       end as "Sport" 
from people

Но это, конечно, не лучшая практика.

Ответ 2

MySQL имеет оператор CASE. В SQL Server работает следующее:

SELECT
    CASE MyColumnName
        WHEN 1 THEN 'First'
        WHEN 2 THEN 'Second'
        WHEN 3 THEN 'Third'
        ELSE 'Other'
    END

Ответ 3

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

enter image description here

Непосредственно из оракула документация:

Пример: этот пример декодирует значение storage_id. Если storage_id равно 1, функция возвращает "Southlake"; если в файле warehouse_id указано значение 2, то возвращается "Сан-Франциско"; и так далее. Если имя_пакета не равно 1, 2, 3 или 4, функция возвращает "Non domestic".

SELECT product_id,
       DECODE (warehouse_id, 1, 'Southlake', 
                             2, 'San Francisco', 
                             3, 'New Jersey', 
                             4, 'Seattle',
                                'Non domestic') "Location" 
  FROM inventories
  WHERE product_id < 1775
  ORDER BY product_id, "Location";

Ответ 4

Выражение CASE может помочь. Тем не менее, может быть даже быстрее иметь небольшую таблицу с первичным ключом int и строкой name, например

1  baseball
2  football

и т.д. и JOIN в соответствующем запросе.

Ответ 5

Как вы думаете, было бы полезно хранить эти отношения между целыми числами и строками в самой базе данных? Пока вы должны хранить эти отношения, имеет смысл хранить его близко к вашим данным (в базе данных), а не в вашем коде, где он может потеряться. Если вы используете это решение, это приведет к тому, что целое число будет иметь внешний ключ для значений в другой таблице. Вы сохраняете целые числа в другой таблице, скажем sports, с sport_id и sport и присоединяйте их как часть вашего запроса.

Вместо SELECT * FROM my_table вы бы SELECT * FROM my_table и использовали соответствующее соединение. Если не каждая строка в вашем главном столбце имеет соответствующий вид спорта, вы можете использовать левое соединение, в противном случае выбирать из обеих таблиц и использовать = в предложении where, вероятно, достаточно.

Ответ 6

Определенно, в БД хранятся строковые значения. Я не эксперт по БД каким-либо образом, но я бы рекомендовал создать таблицу, содержащую строки и соответствующие им целочисленные значения. Оттуда вы можете определить взаимосвязь между двумя таблицами, а затем сделать JOIN в select, чтобы вывести строчную версию целого числа.

tblSport Columns
------------
SportID int (PK, eg. 12)
SportName varchar (eg. "Tennis")


tblFriend Columns
------------
FriendID int (PK)
FriendName (eg. "Joe")
LikesSportID (eg. 12)


In this example, you can get the following result from the query below:
SELECT FriendName, SportName
FROM tblFriend
INNER JOIN tblSport
ON tblFriend.LikesSportID = tblSport.SportID

Человек, это поздно. Надеюсь, я понял это правильно. Кстати, вы должны прочитать разные типы Joins - это самый простой пример.