2016-09-20 7 views
3

caseステートメントでレコードがフィルタリングされないことが検出されました。デベロッパーはそれがそうであることを記録していました....SQL Server Caseステートメントでレコードがフィルタリングされていません

日付範囲のレコード数を制限したいのですが、このコードはそうしません。コードは日付にフィルタリングしないことを

declare @ClientId [int], 
     @EventStartDate DateTime, 
     @EventEndDate DateTime 

set @ClientId = 1 
set @EventStartDate = '2016-05-23' 
set @EventEndDate = '2016-09-08' 

SELECT 
    [CalendarEventId], [ClientId], 
    [EventDate], 
    [Title], 
    [EventText], 
    [CreatedBy], [CreatedDate], 
    [ModifiedBy], [ModifiedDate], 
    CASE 
     WHEN [EventDate] >= @EventStartDate 
      AND EventDate <= @EventEndDate 
     THEN 'ACTIVE' 
     ELSE 'NOT ACTIVE' 
    END AS [STATUS] 
FROM 
    [dbo].[CalendarEvent] 
WHERE 
    ClientId = @ClientId 
ORDER BY 
    EventDate 
+1

は 'WHERE'句で条件を含めます。 –

+1

T-SQLの 'CASE'は**式**です(「文」ではありません)。これは単一のアトミックな値に評価されます。したがって、どのような種類のデータフィルタリングも行いません** ... –

答えて

4

あなたの主張が正しいとあなたの友人は、それが間違っています。日付範囲でフィルタリングする場合

もあなたがこれまであなたwhere句を変更する必要があります。

WHERE ClientId = @ClientId 
    AND EventDate >= @EventStartDate 
    AND EventDate <= @EventEndDate 

クエリでcase表現がない唯一のものは条件付きで列の出力を設定することです結果セットに含まれます。

我々はまた、それはあなたがいずれかを使用できますが、ただの代替を提供する使用することも簡単です両方同じ結果を返すの間で使用することができます
+0

ありがとう、私はSQLに錆びていて、彼らはほとんど私に確信していた... SMH、thxあなた –

+0

申し訳ありませんが、私は答えとして選択することができなかった、 –

0

:あなたは、レコードをフィルタ処理する必要がある場合

FROM [dbo].[CalendarEvent] 
WHERE ClientId = @ClientId 
    AND EventDate BETWEEN @EventStartDate AND @EventEndDate 
ORDER BY EventDate 
関連する問題