2011-07-25 17 views
2

私は中規模企業のEEO調査とレポートの更新タスクを割り当てられました。私はストアドプロシージャを使用してレポートを生成しています。すべてが良いですが、構文の問題です。要件の1つは、ユーザーがEEOジョブ・グループ番号で結果をフィルタリングすることを動的に許可することです。レポートページが読み込まれると、すべてのジョブグループが結合されたテーブルが読み込まれます。 10個のEEOジョブ・グループの1つを選択するか、またはデフォルトで、すべてのジョブ・グループ結合(フィルタリングなし)を選択できるページにDropDownListを配置しました。 DDLはポストバックを実行し、パラメータを設定します。 @intEooJobGroupID。テーブルにはDDLの中に実際には0のID値はありません。私は@intEeoJobGroupID <> 0(パラメータ> 0 <場合は効果的に別のANDステートメントを追加)SQLのWHERE句でIF/THENまたはCASEを使用

I場合(USP)クエリが1つの渡されたパラメータ@intEeoJobGroupID = 0 if文のセット、および別のものを使用したいですいくつのEEOレコードがクエリの要件を満たしているかのカウントを返したいとします。私はIF/THEN、CASEをさまざまな形式で試してみましたが、構文が正しいとは思えません。例では、私は、THEN文の最初の=に近いメッセージ「不正な構文だけでなく、ELSEキーワードを取得下回る。

任意のヒントを?

DECLARE @intEeoJobGroupID INT 

SELECT 
    COUNT (E.intEeoID) 

FROM 
    dbo.NewEEO AS E 
WHERE 
    CASE WHEN @intEeoJobGroupID = 0 

    THEN 
      E.intGenderID = 1 
     AND E.intRaceID = 2 

    ELSE 
      E.intGenderID = 1 
     AND E.intRaceID = 2 
     AND E.intEeoJobGroupID = @intEeoJobGroupID 

答えて

0

あなたは

を追加する必要があります

例末で終了

+0

これはまだ動作しません。彼はCASEを使用して、実行ブロックを定義しようとしています。それだけではうまくいきません。 –

+0

私は質問を深くチェックしませんでした。そうです、私は構文を修正していました。 – sara

5

あなたは男ですあまりにも複雑なことをaking:

WHERE E.intGenderID = 1 
    AND E.intRaceID = 2 
    AND (E.intEeoJobGroupID = @intEeoJobGroupID OR @intEeoJobGroupID = 0) 

を他の誰かがすでに述べたように、既存の構文は、「END」に欠けていたが、それはまだそれが追加では動作しません。将来的にこの権利を得るためには、SQLのCASE式はそれだけであることを覚えておいてください。。これらは、ステートメントではありません。これは、C#コードのifステートメントで使用される可能性があるためです。フロー制御にCASEを使用せず、ブロックを定義しようとしています。

+0

ジョエルに感謝します。それが私を逃していた論理だった... – Matthew

2

ケース条件の結果を比較することはできません。あなたは、実際の条件は、この規則に合うようにしようと、あなたが使用していない終わるだろう、しかし

CASE @case_value 
WHEN 0 THEN 
    some_column 
ELSE 
    some_other_column 
END = @some_value 

:あなたはwhere句でcaseを使用している場合、それはオペレータの片側にする必要があります@Joelが指摘する通り、caseの文はまったくありません。

3

booleanをCASE文から戻そうとしないでください。その代わりに、CASE文の外側でチェックされたある値を返します(ブール値になります)。

CASE WHEN @mode = 1 THEN CASE WHEN <Condition1> THEN 1 ELSE 0 END 
    WHEN @mode = 2 THEN CASE WHEN <Condition2> THEN 1 ELSE 0 END 
END 
= 
1 

注:これにより、実行計画と完全なパフォーマンスが作成されます。あなたはより良い... 本当ブロックIFとおそらく本当クエリ、または労働組合

IF @mode = 1 
    SELECT foo FROM bar WHERE <Condition1> 
ELSE IF @mode = 2 
    SELECT foo FROM bar WHERE <Condition2> 

を使用したりしています...

SELECT foo FROM bar WHERE <condition1> AND @mode = 1 
UNION ALL 
SELECT foo FROM bar WHERE <condition2> AND @mode = 2 

大量のコードの重複を防ぐために、大量のクエリをVIEWにカプセル化すると便利です。