私は、int値を特定の文字列に変換するうまい方法があることを期待していました。列挙型に似ていますが、必ずしも実装ではありません。intを文字列に変換する巧妙なメソッド?
フィールドSOE.ObsTypeは0-2の範囲のintです。私はそれを何とかクエリに変換できるのは素晴らしいだろう。これは私がグリッドビューにバインドする前にコード内の列挙型に変換する必要はありませんので、参考になります。
0:従業員
1:位置
2:部門
私は、int値を特定の文字列に変換するうまい方法があることを期待していました。列挙型に似ていますが、必ずしも実装ではありません。intを文字列に変換する巧妙なメソッド?
フィールドSOE.ObsTypeは0-2の範囲のintです。私はそれを何とかクエリに変換できるのは素晴らしいだろう。これは私がグリッドビューにバインドする前にコード内の列挙型に変換する必要はありませんので、参考になります。
0:従業員
1:位置
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
...
あなたはいつもとObsType
テーブルとID
列とText
列を作成することができ、その後、ちょうどあなたのクエリに参加します。
これは間違いなく正しい軌道に乗りました。私はこれをやろうと考えていましたが、単純な列挙のような小さな値を持つテーブルでデータベースを混乱させないようにしたいと考えました。私はその問題を解決するために一時的なテーブルアプローチを行った。 –
のための条件は、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/*
これは、ステートメントの選択部分または最後に配置されますか? –
私はあなたのアプローチが好きです。追加のテーブルを利用するのではなく、きれいでシンプルなので、コンストラクトを使用してください。 = D ty sir! –