Sql 将int转换为string的聪明方法?
我希望有一种将int值转换为特定字符串的简洁方法。有点类似于枚举,但不一定在实现中Sql 将int转换为string的聪明方法?,sql,stored-procedures,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 AN
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的整数。如果我能在查询中以某种方式转换它,那就太棒了。这会很有帮助,所以在将其绑定到gridView之前,我不需要在代码中将其转换为枚举
0:员工1:位置
2:Department您可以创建一个带有and
ID
列和一个Text
列的ObsType
表,然后在查询中进行连接。您可以创建一个带有andID
列和Text
列的ObsType
表,然后在查询中进行连接
CASE SOE.ObsType
WHEN 0 THEN '0: Employee'
WHEN 1 THEN '1: Position'
WHEN 2 THEN '2: Department'
END AS ObsName
不过,作为查找表,这会更好。例如,当您想要3=“3:除法”时会发生什么?您需要如何更改代码片段?您并没有用查找表将数据库弄得乱七八糟,而是在正常化
如果您认为这是杂乱无章的,那么使用前缀表示查找表,而不是“真实”数据表
如果它确实是静态的,那么它可能是SOE表中的一个计算列,因此在没有查找表的情况下只存储一次案例
编辑,例如:
它可以是末端,也可以是中间。此外,为了清晰起见,您应该将连接和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
或
不过,作为查找表,这会更好。例如,当您想要3=“3:除法”时会发生什么?您需要如何更改代码片段?您并没有用查找表将数据库弄得乱七八糟,而是在正常化
如果您认为这是杂乱无章的,那么使用前缀表示查找表,而不是“真实”数据表
如果它确实是静态的,那么它可能是SOE表中的一个计算列,因此在没有查找表的情况下只存储一次案例
编辑,例如:
它可以是末端,也可以是中间。此外,为了清晰起见,您应该将连接和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
或
案例
版本是最有效的计划,但可能存在代码维护缺点
您也可以使用视图。这会将映射编译为常量表。缺点是通过管理前端更新视图不太容易
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/*
案例
版本是最有效的计划,但可能存在代码维护缺点
您也可以使用视图。这会将映射编译为常量表。缺点是通过管理前端更新视图不太容易
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/*
这无疑使我走上了正确的道路。我曾想过这样做,但我希望避免数据库中的表像简单枚举一样没有什么价值。我采用了一种临时表格的方法来解决这个问题。这无疑使我走上了正确的道路。我曾想过这样做,但我希望避免数据库中的表像简单枚举一样没有什么价值。我采用了一种临时表方法来解决这个问题。这是放在语句的select部分还是放在末尾?我喜欢你的方法。使用构造,而不是使用额外的表=迪蒂先生!这是放在声明的选择部分还是结尾?我喜欢你的方法。使用构造,而不是使用额外的表=迪蒂先生!