2012-03-27 14 views
2

フラグを使用して別のWHERE句を選択できますか?このようなもの。フラッグに基づくWhere句の条件

SELECT fields 
from T3 t3 
left outer join T1 t1 on T1.Id=t2.Id 
WHERE 
    CASE 
     WHEN @Status <> 1 
     THEN (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1) 
     ELSE t2.Id = @SID AND t2.StatusID = 12 
GROUP BY whatever 
+0

T3から選択してT1に接続していますが、どこにT2に参加していないのですか?コードがありませんか? – Taryn

+0

うん!!タイプミスについては申し訳ありません。私は同じことをやっているが、Parseエラーが出ている。 '='付近の構文が正しくありません。 WHEREステートメントで.. – user424134

+0

あなたのクエリでT2に参加していますか?可能であれば、質問を編集して完全なクエリを投稿できますか? – Taryn

答えて

0

好ましい方法:

WHERE 
    (@Status <> 1 AND t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1) 
    OR (t2.Id = @SID AND t2.StatusID = 12) 

か、これはcase文を読み少し楽です:

WHERE 
CASE WHEN @Status <> 1 
     AND t3.Id = @SId 
     AND sh.StatusId = 3 
     AND k.StatusId = 1 THEN 1 
WHEN t2.Id = @SID 
     AND t2.StatusID = 12 THEN 1 
ELSE 0 END = 1 
+0

ありがとうございます! – user424134

+0

@ user424134:これらのWHERE句のいずれかが質問のロジックに従っているとは思われず、どちらも「偽陽性」エラーになります。私の答えを見てください。 – onedaywhen

+0

@oneday私の答えが元のものと一致しないと私は同意しますが、彼は元のものと闘っていましたが、これはおそらく論理的に望んでいると思います。もしそうでなければ、それをより明確に書くことは、彼を正しい論理に導く助けになるでしょう。 – JBrooks

2

なぜCASE WHENが必要ですか?ステータス<> 1 AND ... OR ...を実行できますか?

1

には、ENDを追加できます。

SELECT fields 
FROM T3 t3 
LEFT OUTER JOIN T1 t1 on T1.Id=t2.Id 
WHERE 
     CASE 
      WHEN @Status <> 1 THEN 
      (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1) 
      ELSE 
      t2.Id = @SID AND t2.StatusID = 12 
     END 
GROUP BY whatever 
+0

これは、どちらの場合でもENDを使って動作します。WHERE文でParserエラーを取得しています。誤った構文 '='の近く – user424134

+0

クエリが完了していません - エイリアス 't2'は解決されません。私はあなたのコードをコピーし、必要な構文変更を説明するために 'END'を追加しました。 – Ryan

1

です。

where case 
    when @Mode = 1 and A.Foo = B.Foo then 1 
    when @Mode = 2 and A.Foo > B.Foo + 5 then 1 
    when A.Bar < @Mode then 1 
    else 0 
    end = 1 
1

Iドンの使用のようなものになるので、値を返しますCASE @JBrooksがあなたのcase文を正しく翻訳したと思います(そして、心配なく、偽陽性を招く可能性があります)。

私は次のようにCASE同等であると思う:

WHERE 1 = CASE 
      WHEN @Status <> 1 
      THEN CASE 
        WHEN (t3.Id = @SID AND sh.StatusId = 3 AND k.StatusId = 1) 
        THEN 1 
        END 
      ELSE CASE 
        WHEN t2.Id = @SID AND t2.StatusID = 12 
        THEN 1 
        END 
      END 

私は、しかし、そのような構築物は読み、デバッグ、それが変形することができることに同意するのは難しいことに同意します。しかしながら、@ JBrooksの「好ましい方法」は論理和の正規形(すなわち、括弧を必要とする(predicate_1 OR predicate_2))であるが、私は結合標準形(すなわち、preidcate_1 AND preidcate_2)を好む。

WHERE 
(p.Status = 1 OR (t3.Id = p.SID AND sh.StatusId = 3 AND k.StatusId = 1)) 
AND 
(p.Status <> 1 OR (t2.Id = p.SID AND t2.StatusID = 12))