2017-02-08 5 views
0

私はウェブを検索しましたが、私の問題の解決策を見つけることができませんでした(しかし、間違ったキーワードを使用しています)。CASE文を使用してWHERE句に論理演算子を追加する方法はありますか? - T-SQL

私は、一連のレコードの自動検証(毎晩)を行うストアドプロシージャを持っています。ただし、ユーザーが1つのレコードに対して同じ検証を手動で実行する場合があります。元のSELECTステートメント(すべてのレコードをループする)を設定すると、指定したレコードIDを持つAND演算子を取得する必要があります。私はこのようにして、select文全体をコピーして手動部分のためだけに変更する必要がないようにしたい。

次のように、元の文は次のとおりです。

WHERE faktureerperorder = 1
DECLARE GenerateFacturen CURSOR LOCAL FOR 
    SELECT TOP 100 PERCENT becode, dtreknr, franchisebecode, franchisenemer, fakgroep, vonummer, vovolgnr, count(*) as nrVerOrd, 
              FaktuurEindeMaand, FaktuurEindeWeek 
     FROM (
      SELECT becode, vonummer, vovolgnr, FaktuurEindeMaand, FaktuurEindeWeek, uitgestfaktuurdat, levdat, voomschrijving, vonetto, 
           faktureerperorder, dtreknr, franchisebecode, franchisenemer, fakgroep, levscandat 
       FROM vwOpenVerOrd WHERE [email protected] AND levdat IS NOT NULL AND fakstatus = 0 
       AND isAllFaktuurStukPrijsChecked = 1 AND IsAllFaktuurVrChecked = 1 
       AND (uitgestfaktuurdat IS NULL OR uitgestfaktuurdat<[email protected]) 
         ) sub 
       WHERE faktureerperorder = 1 
       GROUP BY becode, dtreknr, franchisebecode, franchisenemer, fakgroep, vonummer, vovolgnr, 
           FaktuurEindeMaand, FaktuurEindeWeek 
       ORDER BY MIN(levscandat) 

私はこのような何かを思い付いた:

WHERE faktureerperorder = 1 AND CASE WHEN @myParameterManual = 1 THEN [email protected] ELSE 1=1 END 

しかし、これは動作しません。 @myParameterManualは、特定のレコードのみを選択する必要があるかどうかを示します。 [email protected]はレコードのIDです。私は1=1の設定ですべてのレコードを取得すると思った。

どのように私の目標(おそらくより効率的なアイデアやより良いアイデア)を達成するためのアイデアですか?

+2

'どこのパーサー= 1 AND(@myParameterManual = 0 OR vonummer = @vonummer)' – Eric

+0

[this](http://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition/10260297#10260297)Answer help? – HABO

答えて

2

私はあなたの質問を読むのが難しいと思っていますが、これはあなたが達成しようとしているものの簡単な例です。

演算子を使用してWHERE句を使用して、フィルタに2つのオプションを指定しました。あなたは、フィルタ値に応じて異なる出力を取得します同じクエリを使用:

CREATE TABLE #test (id INT, val INT); 

INSERT INTO #test 
     (id, val) 
VALUES (1, 10), 
     (2, 20), 
     (3, 30); 

DECLARE @filter INT; 

-- null filter returns all rows 
SET @filter = NULL; 

SELECT * 
FROM #test 
WHERE (@filter IS NULL 
      AND id < 5 
     ) 
     OR (@filter IS NOT NULL 
      AND id = @filter 
      ); 

-- filter a specific record 
SET @filter = 2; 

SELECT * 
FROM #test 
WHERE (@filter IS NULL 
      AND id < 5 
     ) 
     OR (@filter IS NOT NULL 
      AND id = @filter 
      ); 

DROP TABLE #test; 

まず、クエリのすべて返します:

id val 
1 10 
2 20 
3 30 

2番目のクエリは、単一の行を返します。

id val 
2 20 
+0

これは完全に機能しました。ありがとうございました! – Nicolas

関連する問題