2010-11-21 9 views
1

私は、int値を特定の文字列に変換するうまい方法があることを期待していました。列挙型に似ていますが、必ずしも実装ではありません。intを文字列に変換する巧妙なメソッド?

フィールドSOE.ObsTypeは0-2の範囲のintです。私はそれを何とかクエリに変換できるのは素晴らしいだろう。これは私がグリッドビューにバインドする前にコード内の列挙型に変換する必要はありませんので、参考になります。

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"のようにしたい場合はどうなりますか?どのようにコードを変更する必要がありますか?ルックアップテーブルを使ってデータベースを混乱させるわけではなく、正規化しています。

混乱していると思われる場合は、プレフィックスを使用して、「実際の」データテーブルではなくルックアップテーブルを指定します。それは本当にが静的​​であればCASEは、ルックアップテーブルなし一度を格納しているので、

は、それは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 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/* 
関連する問題