我想将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
答案 0 :(得分:4)
您可以合并AND
和OR
条件以获得所需的结果。您可以使用以下查询:
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