2010-11-21 2 views
1

Я надеялся, что существует четкий способ преобразования значения int в определенную строку. В некоторой степени сродни перечислению, но не обязательно в реализации.Умный метод для преобразования 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: Отдел

ответ

2
CASE SOE.ObsType 
    WHEN 0 THEN '0: Employee' 
    WHEN 1 THEN '1: Position' 
    WHEN 2 THEN '2: Department' 
END AS ObsName 

Хотя, это лучше как таблица поиска. Что происходит, если вы хотите, например, иметь 3 = «3: Отдел»? Как можно изменить фрагменты кода? Вы не загромождаете базу данных поисковыми таблицами, вы нормализуетесь.

Если вы считаете, что это беспорядок, используйте префикс для обозначения таблицы поиска, а не «реальной» таблицы данных.

Если это действительно является статична, то это может быть вычисляемый столбец в таблице SOE поэтому СЛУЧАЙ хранится раз без таблицы перекодировки.

Edit, например:

Это может быть в конце или в середине. Кроме того, следует отдельная 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 
    ... 
+0

будет ли это помещено в выбранную часть инструкции или в конце? –

+0

Мне нравится ваш подход. Чистая и простая, а не использование дополнительной таблицы, используйте конструкцию. = D ty sir! –

2

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

+0

Это определенно положило меня на правильный путь. Я думал об этом, но я хотел избежать загромождения базы данных таблицами, которые имели такое малое значение, как простое перечисление. Я решил использовать временную таблицу для решения этой проблемы. –

0

версия 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/* 
Смежные вопросы