2017-05-08 142 views
0

對不起,我沒有一個完整的查詢,因爲我的原文實際上很長,但我覺得你可能能夠發現我的語法錯誤。基本上我聲明2個變量,如果一個變量是空白的,我需要where語句成爲該字段不在其他變量中的地方。SQL Where語句帶CASE變量

Where dnCP_FromServiceDate >= '01/01/2016' And 
dnCP_FromServiceDate <= '01/31/2016' And 
dnCP_RecordStatus <> 'V' 
AND CASE WHEN @inpDXIN = '' THEN 
predxDiagnosisCode not in (@inpDXNOTIN) 
ELSE predxDiagnosisCode IN (@inpDXIN) 
END 

即使我能使用類似的語句得到查詢的片斷我可以計算出地雷,但我無法找到任何類似的事情。任何幫助極大地讚賞

+0

用你正在使用的數據庫標記你的問題。 –

+0

你能提供'@ inpDXNOTIN'的樣本值和'@ inpDXIN'是他們的字符串,內存表等嗎? – gordy

回答

1

一般來說,你不想在where子句中使用case。相反,只要使用正規布爾邏輯:

Where dnCP_FromServiceDate >= '2016-01-01' and 
     dnCP_FromServiceDate <= '2016-01-31' and 
     dnCP_RecordStatus <> 'V' and 
     ((@inpDXIN = '' and predxDiagnosisCode <> @inpDXNOTIN) or 
     (@inpDXIN <> '' and predxDiagnosisCode IN (@inpDXIN) 
    ) 

注:

  • 使用ISO/ANSI標準日期格式。更不明確。
  • IN (@var)= @var相同。您無法通過變量傳遞in列表。如果您需要該功能,請詢問另一個的問題。
  • SQL的大多數方言不允許從case返回布爾表達式。以上解決這個「限制」。
+0

我認爲這可能會忽略邏輯漏洞 - 您的解決方案與OP代碼執行的操作相同:它只檢查pDXIN是否爲空,並且不檢查inDDXNOTIN。如果他們都是空的呢?如果兩者都不是空的呢? – Scott

+0

@Scott。 。 。語法錯誤是'else'子句的布爾表達式。查詢有幾個問題,我試圖解決。 –

+0

所以上面的代碼看起來像它可能會幫助,但它會帶回我在結果 –