2017-11-07 18 views
0

こんにちは私は私の答えを得ることができませんでした。いずれかの人がこの要件のために私を助けます。はwhere文節case文でヌルです

declare @val varchar(800) 
    set @val='current data' 
select * from [FeatureCal_GrowthPlan] where snapshot_dt= case when @val='current data' then '2017-01-01' else @val end 

上記のクエリは正常に動作しています。しかし、私の要件は、私は@ヴァル=「現在のデータは」他の変数@valが持つそれぞれの日付を選択trueの場合、すべてのnull値を選択したいと思います

declare @val varchar(800) 
set @val='current data' 
select * from [FeatureCal_GrowthPlan] where snapshot_dt= case when @val='current data' then is null else @val end 

の下に似ています。

事前にありがとう

+0

'is null'の代わりに' null'を試してください –

+0

snapshot_dt = nullとsnapshot_dtはnullです。私は正しいですか? – Singaravelan

+0

あなたは正しいです。 NULLは未知の値を表します。したがって、 'snapshot_dt = null'は、未知の値が他の値と一致するかどうかわからないため、「不明」のみになります。 'snapshot_dt = null'は決して真実ではありません。 –

答えて

0

私は以下のクエリを使用して回答を得ました。

 declare @val varchar(800) 
set @val='current data' 
select * from [FeatureCal_GrowthPlan] where isnull(snapshot_dt,'1900-01-01')= case when @val='current data' then '1900-01-01' else @val end 
+0

snapshot_dt列にインデックスがある場合。列(ISNULL)の操作のため、この方法では索引を適切に使用できません。行が多すぎる場合は、この方法をお勧めしません。 –

+0

これは一般的なアプローチです。 'snapshot_dt'の値が' 1900-01-01'でないと仮定します。そのため、特定のユースケースではうまくいくかもしれませんが、一般的に、実際に尋ねた質問に対する回答としては機能しません。しかし、あなたの答えにこの限界を記述すれば、その答えは他の人にとって有用である可能性が高いです。それとは別に、@ sarslanのコメントも正しいです。 – hvd

1

これは使用できます。

declare @val varchar(800) 
set @val='current data' 
select * from [FeatureCal_GrowthPlan] where 
    (@val='current data' AND snapshot_dt is null) 
    OR 
    (@val <> 'current data' AND snapshot_dt = @val) 
+0

良いアプローチ、私は上記のクエリを試みたときに、 "文字列から日付や時間を変換するときに" onversionが失敗しました "というエラーが表示されます。 convert varcharメソッドを使用することで克服できます。 – Singaravelan