我希望有一种将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:部门
答案 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/*