2016-12-19 15 views
-1

case文に基づいて列を選択していますが、case文で返される列に基づいてWHERE句でフィルタリングします。SQL Server whereは選択されたcase列に基づく条件

Select 
    case 
     when UpdatedDate is not null 
      then UpdatedDate 
     when InsertedDate is not null 
      then InsertedDate 
     else VisitedDate 
    end 
From 
    tbl_UserTracking 
where 
    [UpdatedDate/InsertedDate/VisitedDate(based on case)] between date1 and date2 
+0

質問を単純化しなかった方がいいでしょう。それらの日付列が異なる表からのものであり、それらの値が外部結合のために潜在的にNULLである場合、結合ロジックおよび/またはwhere句で何をするかは、データおよび必要な結果に依存します。より現実的なバージョンの質問を考え直してください。また、サンプルデータと予想される結果をorovideします。よりよい結果が得られるように質問する方法についてのガイドがあります。 –

答えて

1

SELECT * FROM 
( SELECT case when UpdatedDate is not null then UpdatedDate 
       when InsertedDate is not null then InsertedDate 
       else VisitedDate END AS DateColumn 
    FROM tbl_UserTracking 
) T 
WHERE DateColumn BETWEEN date1 AND date2 
+0

パフォーマンスに問題はありませんか?巨大なデータが日付フィルタリングを使用した内部クエリから返されるためです。 – Gopinath

+0

*おそらく*はありません。私はあなたがこのクエリのためにテーブルスキャンかインデックススキャンのいずれかを持っていると思います。クエリアナライザを実行し、クエリプランを覗いてみてください。 –

0
SELECT COALESCE(UpdatedDate, InsertedDate, VisitedDate) AS DateColumn 
FROM tbl_UserTracking 
WHERE COALESCE(UpdatedDate, InsertedDate, VisitedDate) BETWEEN @date1 AND @date2 
+0

列は異なる表からのものであり、ケース条件も異なるため、条件を単純化しただけです。 – Gopinath

+0

@Gopinath COALESCE(T1.UpdatedDate、T3.InsertedDate、T8.VisitedDate) – JBrooks

0

使用coalesce()を試してみてください。

Select coalesce(UpdatedDate, InsertedDate, VisitedDate) 
From tbl_UserTracking 
where coalesce(UpdatedDate, InsertedDate, VisitedDate) between date1 and date2; 

変数を定義したい場合は、CTEまたは副問合せを使用することができます。これはwhere句を簡素化します。私は、SQL Serverでapplyというキーワードを使用する横結合を指摘したいと思います。

Select v.thedate 
From tbl_UserTracking t outer apply 
    (values (coalesce(UpdatedDate, InsertedDate, VisitedDate)) 
    ) v(thedate) 
where v.thedate between date1 and date2; 
関連する問題