代码之家  ›  专栏  ›  技术社区  ›  Matthew Cox

把int转换成string的聪明方法?

  •  1
  • Matthew Cox  · 技术社区  · 15 年前

    我希望有一种简洁的方法可以将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:部门

    3 回复  |  直到 15 年前
        1
  •  2
  •   gbn    15 年前
    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(filter)条件

    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
  •  2
  •   Hans Olsson    15 年前

    你可以创造一个 ObsType 带和的桌子 ID 列和a Text 列,然后在查询中执行联接。

        3
  •  0
  •   Martin Smith    15 年前

    这个 case 版本是最有效的计划,但可能有代码维护的缺点。

    你也可以使用视图。这将把映射编译成计划的常量表。缺点是通过管理前端更新视图不太容易。

    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/*
    
    推荐文章