Умный метод для преобразования int в строку? - PullRequest
1 голос
/ 21 ноября 2010

Я надеялся, что есть аккуратный способ преобразования значения 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 имеет тип int в диапазоне 0-2.Было бы здорово, если бы я мог как-то преобразовать это в запросе.Это было бы полезно, поэтому мне не нужно преобразовывать его как перечисление в моем коде перед привязкой его к gridView.

0: Сотрудник
1: Должность
2: Отдел

Ответы [ 3 ]

2 голосов
/ 21 ноября 2010
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 голосов
/ 21 ноября 2010

Вы всегда можете создать таблицу ObsType со столбцами и ID и столбцом Text, а затем просто выполнить объединение в своем запросе.

0 голосов
/ 21 ноября 2010

Версия 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/*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...