2015-06-15 93 views
0

我想將SQL查詢轉換爲SQL服務器中的過程,但我在IF語句中遇到問題。我如何在SQL存儲過程中使用IF語句

這是我想要實現的邏輯:

//If the patientStatus equals "all" there will be no condition 

patientStatus.ToString() == "all" ? "" : 
(
     patientStatus.ToString() == "out" 
     ? " AND CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NOT NULL" 
     :" AND CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NULL " 
) 

搜索有關如何在存儲過程IF語句中使用後,我想出了這一點,但它有錯誤

IF(@PATIENT_STATUS != 'all') 
BEGIN 
    if(@PATIENT_STATUS = 'out') 
    BEGIN 
     AND CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NOT NULL 
    END 
    else 
     BEGIN 
     AND CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NULL 
     END  
    END 
+0

什麼錯誤你好嗎 – Matt

+0

@馬特, 'IF_'附近的語法錯誤,'CMS_ENCOUNTER'附近的語法不正確 –

回答

4

您可以結合ANDOR條件來獲得您想要的結果。您可以使用以下查詢:

SELECT * FROM tablename AS CMS_ENCOUNTER 
WHERE 
    (@PATIENT_STATUS = 'all') OR 
    (@PATIENT_STATUS = 'out' AND CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NOT NULL) OR 
    (@PATIENT_STATUS <> 'out' AND CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NULL) 

在這種情況下首先評估條件@PATIENT_STATUS = 'all'。如果它評估爲真,你會得到所有結果。如果它評估爲假,那麼只有其他條件纔會被評估。

第二個條件((@PATIENT_STATUS = 'out' AND CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NOT NULL)只有當病人狀態out評價,否則第三個條件進行評估

+0

我會傳遞@PATIENT_STATUS的值,並且每個個案都有它自己的條件(out,in,all),如果它是「all」將返回所有患者,否則我將返回特定類型的患者。 –

+0

@HananKhatib這很好,如果@PATIENT_STATUS ='all'',那麼你將檢索所有結果。否則,你會得到過濾結果 – dotnetom

+0

你是對的,現在很清楚。感謝朋友 –

0

你也可以這樣做:?

AND CASE 
     WHEN @PATIENT_STATUS = 'all' THEN 1 = 1 
     WHEN @PATIENT_STATUS = 'out' THEN CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NOT NULL 
     ELSE CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NULL 
    END 
相關問題