例如,我的数据库中有一个表格如下:
|物品编号|商品名称|价格|物品状态|
其中Item ID = int,Item Name = string,Price = int, Item Status = Enum
至于物品状态...... 让我们说“2”代表“即将推出”,
“1”代表“可用”,
而“0”代表“售完”
我希望显示这样的信息,以便我可以告诉用户哪个视图输出表以更可接受的输出(字符串)知道状态,而不是查看枚举值:
| Item ID | Item Name | Price | Item Status | **Description** |
| 123 | Apple | [some number] | 0 | Sold Out |
| 234 | Orange | [some number] | 2 | Coming Soon |
说明是临时列,我希望将其显示为附加信息。
我可以知道一个GO语法是如何进行的吗?
请指导我。非常感谢你。
答案 0 :(得分:7)
最简单的方法是使用CASE语句 - 假设您只有3个描述?
select ItemId,
Item_name,
price,
Item_status,
Case
When Item_status = 0 then 'Sold Out'
When Item_status = 1 then 'Available'
When Item_status = 2 then 'Coming Soon'
End as [Description]
From dbo.YourTable
另一种选择,如果要创建临时表并加入其中。
Create Table #TempEnums
(
Id int,
Desc varchar(50)
)
Insert Into #TempEnums
Select 0, 'Sold Out' Union Select 1, 'Available' Union Select 2, 'Coming Soon'
然后简单地加入临时表
select a.ItemId,
a.Item_name,
a.price,
a.Item_status,
b.Desc as [Description]
From dbo.YourTable a
Join #TempEnums b on a.Item_Status = b.Id
修改强>
更改[description]
列的数据类型,只需包含Convert
语句
Convert(Varchar(25),
Case
When Item_status = 0 then 'Sold Out'
When Item_status = 1 then 'Available'
When Item_status = 2 then 'Coming Soon'
End) as [Description]
答案 1 :(得分:1)
您可以创建一个表 descr (id,string)来放置这些记录:
(0,'售完'),(1,'可用'),(2,'即将推出')
然后在输出期间连接表...
SELECT table.*,descr.description FROM table INNER JOIN descr
ON table.enum_col = descr.id
或者您可以使用CASE命令...
<强>编辑:强> 我更喜欢第一种解决方案,因为如果将来你必须添加另一个枚举值,你可以只使用db;使用 case ,您应该更改您的软件中可能难以编写(和编译)的查询,因此您必须重新编译...有时这是一个问题。
答案 2 :(得分:1)
查找基表似乎是一个很好的例子(即'永久')。但是你可以使用CTE来“动态”对待一个例如
WITH StatusesLookup (status_ID, status_description)
AS
(
SELECT status_ID, CAST(status_description AS VARCHAR(20))
FROM (
VALUES (0, 'Sold Out'),
(1, 'Available'),
(2, 'Coming Soon')
) AS StatusesLookup (status_ID, status_description)
)
SELECT T1.Item_ID, T1.Item_Name, T1.Price,
T1.Item_Status, S1.status_description AS Description
FROM YourTable AS T1
INNER JOIN StatusesLookup AS S1
ON S1.status_ID = T1.Item_Status;
答案 3 :(得分:0)
使用Macro的表名为ItemStatus(0,'售完'),(1,'可用'),(2,'即将推出'),选择将是:
select a.ItemId,
a.Item_name,
a.price,
a.ItemStatus,
b.Description
From ItemTable a JOIN ItemStatus b
ON a.ItemStatusId = b.ItemStatusId
答案 4 :(得分:0)
毫无疑问,CASE语句是一种很好的方法,使用用户定义的函数而不是在SELECT语句中放入CASE语句。
CREATE FUNCTION udf_Set_Status
(
@ID INT
)
RETURNS NVARCHAR(25)
AS
BEGIN
DECLARE @Result NVARCHAR(25)
SELECT @Result = Case
When @ID = 0 then 'Sold Out'
When @ID = 1 then 'Available'
When @ID = 2 then 'Coming Soon'
End
RETURN @Result
END
GO
例如:
SELECT ItemId,
Item_name,
price,
Item_status,
DBO.udf_Set_Status (Item_status) AS [Item_status],
FROM dbo.YourTable