SQL select用字符串替换整数

时间:2009-05-29 04:56:05

标签: sql database database-design

目标是使用数字表示的char值替换SQL查询中返回的整数值。例如:

标记为“Sport”的表属性定义为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在传递给程序之前转换值?使用脚本语言来改变程序中的值?改变数据库设计?

6 个答案:

答案 0 :(得分:22)

数据库应该保存这些值,您应该连接到另一个包含该数据的表。

所以你应该有一张表可以说出一个人的列表

  

ID名称FavSport
  1 Alex 4
  2 Gnats 2

然后另一张表有一个运动列表

  

ID Sport
  1篮球   2足球
  3足球
  4踢球

然后你会在这些表之间进行连接

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

会让你回来

  

姓名运动
  Alex Kickball
  Gnat足球

您也可以使用案例陈述,例如。只需使用上面的人员表,您就可以编写类似

的内容
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

但这当然不是最佳做法。

答案 1 :(得分:10)

MySQL有一个CASE语句。以下适用于SQL Server:

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

答案 2 :(得分:3)

在oracle中,您可以使用 DECODE 功能,该功能可以提供无法控制数据库设计的解决方案。

enter image description here

直接来自oracle documentation

示例:此示例解码值warehouse_id。如果warehouse_id为1,则函数返回'Southlake';如果warehouse_id为2,则返回'旧金山';等等。如果warehouse_id不是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";

答案 3 :(得分:2)

CASE表达式可能有所帮助。但是,拥有一个带有int主键和name字符串的小表可能更快,例如

1  baseball
2  football

等,JOIN在查询中恰当。

答案 4 :(得分:1)

您认为在数据库本身中存储整数和字符串之间的这些关系会有帮助吗?只要您必须存储这些关系,将它存储在您的数据(在数据库中)附近,而不是在您可能丢失的代码中。如果使用此解决方案,则会使整数成为另一个表中值的外键。您将整数存储在另一个表中,例如sportssport_idsport,并将它们作为查询的一部分加入。

而不是SELECT * FROM my_table,而是SELECT * from my_table并使用appropriate join。如果不是主列中的每一行都有相应的运动,你可以使用左连接,否则从两个表中选择并在where子句中使用=可能就足够了。

答案 5 :(得分:1)

肯定让DB保存字符串值。我不是任何数据库专家,但我建议您创建一个包含字符串及其相应整数值的表。从那里,您可以定义两个表之间的关系,然后在select中执行JOIN以拉出整数的字符串版本。

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

男人,已经晚了 - 我希望我做对了。顺便说一句,你应该阅读不同类型的连接 - 这是一个最简单的例子。