SQL输出:是否可以创建临时输出列?

时间:2011-05-11 09:10:15

标签: sql

例如,我的数据库中有一个表格如下:

|物品编号|商品名称|价格|物品状态|

其中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语法是如何进行的吗?

请指导我。非常感谢你。

5 个答案:

答案 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