如何在sql stored-procedure中使用IF语句

时间:2015-06-15 09:37:19

标签: sql sql-server stored-procedures

我想将SQL查询转换为SQL Server中的过程,但我在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

2 个答案:

答案 0 :(得分: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'。如果它的计算结果为true,则会得到所有结果。如果它的计算结果为false,则只评估其他条件。

第二个条件((@PATIENT_STATUS = 'out' AND CMS_ENCOUNTER.ENCOUNTER_END_TIME IS NOT NULL)仅在患者状态为out时进行评估,否则评估第三个条件。

答案 1 :(得分: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