如何在 sql 存储过程中使用 IF 语句

How can I use IF statement in sql stored-procedure

我想将 SQL 查询转换为 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

您可以结合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'。如果它的计算结果为真,您将获得所有结果。如果它评估为 false,则仅评估其他条件。

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

你也可以这样做:

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