目标是使用数字表示的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在传递给程序之前转换值?使用脚本语言来改变程序中的值?改变数据库设计?
答案 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 功能,该功能可以提供无法控制数据库设计的解决方案。
直接来自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)
您认为在数据库本身中存储整数和字符串之间的这些关系会有帮助吗?只要您必须存储这些关系,将它存储在您的数据(在数据库中)附近,而不是在您可能丢失的代码中。如果使用此解决方案,则会使整数成为另一个表中值的外键。您将整数存储在另一个表中,例如sports
,sport_id
和sport
,并将它们作为查询的一部分加入。
而不是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
男人,已经晚了 - 我希望我做对了。顺便说一句,你应该阅读不同类型的连接 - 这是一个最简单的例子。