2016-06-15 3 views
0

私は1つのパラメータを取得するSQLでクエリを記述し、クエリ以下の場所のセクションでは、このパラメータを使用しますが、エラーを取得しよう: 私はこれを行うとしますwhere case(sql)のcase statmentの使い方は?

where条件@state=2

で2チェックインと同等 @state場合

where条件@state=3

で3チェックインと同等@state場合は0と等しい@stateが、その後where条件

にチェックしていない場合

私はあなたがこのためにcaseを使用する場合は、ロジックがある場合にこの文を書くことを試みるが、構文エラー

SELECT * 
FROM tbl1 
WHERE @StartDate <= Cast([date] AS DATE) 
     AND Cast([date] AS DATE) <= @endDate 
     AND [reservetype] = @Type 
     AND CASE 
         WHEN @State = 2 THEN [state]=2 
         WHEN @State = 3 THEN [state]=3 
         WHEN @State = 0 then .... 
        END 
+0

を、私は、SQL Serverのタグを追加しました。 –

+0

WHERE句で[状態]に値を代入しようとしていますか? – SpaceghostAli

答えて

1

を得る:

[state] = (CASE WHEN @State IN (2, 3) THEN @state 
       ELSE [state] 
      END) 

これは仮定して、何をしたいんそのstateNULLではありません。

注:私はcast()を除去するために、日付演算を変更

WHERE [date] >= @StartDate AND 
     [date] < DATEADD(day, 1, @endDate) AND 
     [reservetype] = @Type AND 
     ((@state IN (2, 3) and [state] = @state) OR 
     (@state NOT IN (2, 3)) 
    ) 

:として

Iの条件を記述します。 SQL Serverは日付/時刻をdateにキャストするときにインデックスを使用できますが、複雑なWHERE句と混同される可能性があります。したがって、このバージョンはインデックスによって最適化される可能性があります。

+0

どのように私のコードのようなステートメントに条件を追加できますか? – programmer138200

+0

OPには、「状態」と「1」のいずれの比較も言及されていませんでした。 @underscore_d。 –

+1

。 。 OPは編集の前に行った。青い「編集済み。。」行をクリックすると、以前のバージョンが表示されます。 –

1

私はあなたがこの些細なロジックたく間違っていない場合は、次の構文に基づいて

... 
WHERE (@State = 0 or t.State = @State) 
    AND ...