2010-11-21 4 views
1

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 범위의 int입니다. 그것은 쿼리에서 어떻게 든 변환 할 수 있다면 그것은 최고 일 것입니다. 이것은 도움이 될 것이므로 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 : Division"을 원할 때 어떻게됩니까? 어떻게 코드를 변경해야합니까? 조회 테이블을 사용하여 데이터베이스가 어수선하게 정리되어있는 것은 아니며 정규화 중입니다.

혼란 스럽다고 생각되면 접두사를 사용하여 "실제"데이터 표와 대조되는 조회 표를 나타냅니다. 정말 정적 경우 케이스가 룩업 테이블없이 번 저장되도록

후 그것은 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 

또는

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 선생님! –

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/* 
관련 문제