Sql 将int转换为string的聪明方法?

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

我希望有一种将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的整数。如果我能在查询中以某种方式转换它,那就太棒了。这会很有帮助,所以在将其绑定到gridView之前,我不需要在代码中将其转换为枚举

0:员工
1:位置

2:Department

您可以创建一个带有and
ID
列和一个
Text
列的
ObsType
表,然后在查询中进行连接。

您可以创建一个带有and
ID
列和
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部分还是放在末尾?我喜欢你的方法。使用构造,而不是使用额外的表=迪蒂先生!这是放在声明的选择部分还是结尾?我喜欢你的方法。使用构造,而不是使用额外的表=迪蒂先生!