将int转换为字符串的聪明方法?

时间:2010-11-21 09:55:41

标签: sql stored-procedures

我希望有一种将int值转换为特定字符串的简洁方法。有点类似于枚举但不一定在实现中。

SELECT 
    SOE.SafetyObsID,
    SOE.DateAdded,
    SOE.ObsType,
    SOE.DataID,
    SOE.JobID,
    Jobs.JobName
FROM    SafetyObs.SOEntry SOE
    INNER JOIN dbo.JT_Jobs Jobs
    ON  SOE.JobID = Jobs.JobId AND
        Jobs.CompanyId = @CompanyID

字段SOE.ObsType是0到2之间的int。如果我可以在查询中以某种方式转换它将是非常棒的。这将是有用的,所以我不需要在将它绑定到gridView之前将其转换为我的代码中的枚举。

0:员工
1:位置
2:部门

3 个答案:

答案 0 :(得分:2)

您始终可以使用ObsType列和ID列创建Text表,然后在查询中加入。

答案 1 :(得分:2)

CASE SOE.ObsType
   WHEN 0 THEN '0: Employee'
   WHEN 1 THEN '1: Position'
   WHEN 2 THEN '2: Department'
END AS ObsName

虽然,这作为查找表更好。例如,当您想要3 =“3:Division”时会发生什么?您需要更改哪些代码?您没有使用查找表使数据库混乱,您正在规范化。

如果您认为它很混乱,那么使用前缀表示查找表而不是“真实”数据表。

如果确实 是静态的,那么它可能是SOE表中的计算列,因此CASE存储一次而没有查找表。

编辑,示例:

它可以在最后或中间。此外,为了清晰起见,您应该将JOIN和WHERE(过滤器)条件分开

SELECT 
    SOE.SafetyObsID,
    SOE.DateAdded,
    SOE.ObsType,
    CASE SOE.ObsType
       WHEN 0 THEN '0: Employee'
       WHEN 1 THEN '1: Position'
       WHEN 2 THEN '2: Department'
    END AS ObsName,
    SOE.DataID,
    SOE.JobID,
    Jobs.JobName
FROM
    SafetyObs.SOEntry SOE
    INNER JOIN
    dbo.JT_Jobs Jobs ON SOE.JobID = Jobs.JobId
WHERE
    Jobs.CompanyId = @CompanyID

SELECT 
    SOE.SafetyObsID,
    SOE.DateAdded,
    SOE.ObsType,
    SOE.DataID,
    SOE.JobID,
    Jobs.JobName,
    CASE SOE.ObsType
       WHEN 0 THEN '0: Employee'
       WHEN 1 THEN '1: Position'
       WHEN 2 THEN '2: Department'
    END AS ObsName
FROM
    ...
WHERE
    ...

答案 2 :(得分:0)

case版本是最有效的计划,但可能存在代码维护缺陷。

您也可以使用视图。这将映射编译为常量表。缺点是通过管理员前端更新View不太容易。

USE tempdb

go

CREATE VIEW ObsTypeMapping 
AS
SELECT 0 ObsType,  'Employee' Mapping UNION ALL
SELECT 1, 'Position' UNION ALL
SELECT 2, 'Department'

go

SET STATISTICS IO ON;

SELECT 
     CASE number WHEN 0 THEN 'Employee' WHEN 1 THEN 'Position'  WHEN 2 THEN 'Department' END FROM master..spt_values v
WHERE number BETWEEN 0 AND 2
/*
Cost relative to batch 30%
Table 'spt_values'. Scan count 1, logical reads 2*/


SELECT Mapping FROM master..spt_values v
JOIN ObsTypeMapping o
ON o.ObsType = v.number
/*
Cost relative to batch 35%
Table 'spt_values'. Scan count 3, logical reads 6*/

SELECT (SELECT Mapping FROM ObsTypeMapping o WHERE o.ObsType = v.number) Mapping FROM master..spt_values v
WHERE number BETWEEN 0 AND 2
/*
Cost relative to batch 35%
Table 'spt_values'. Scan count 1, logical reads 2/*