CASE WHEN 中的 OR 关键字本身位于 WHERE 子句中

OR keyword in a CASE WHEN which is itself in a WHERE clause

首先 post 在这里,但多年来我一直是潜伏者。开始了:

我得到这个查询,它在 WHERE 中有一个 CASE WHEN 子句。但是,我需要在该 CASE WHEN.

中搜索两种可能的状态

代码如下:

SELECT        
[...]

FROM            
[...]

WHERE        
(Admissions.Session = @Session) AND 

(Admissions.Remark IN 
CASE (RIGHT(@Session, 1)) 
    WHEN 1 THEN ('HY', 'HN')
    WHEN 3 THEN ('AY', 'AN')
END)

基本上,当会话参数的最后一位数字为“1”时,我尝试获取所有 Admissions.Remark 为 'HY' 或 'HN' 的行。 如果会话参数以'3'结尾,那么我想抓取 'AY' 或 'AN'

的备注

我也试过这样的东西:

(Admissions.Remark = CASE (RIGHT(@Session, 1)) 
    WHEN 1 THEN 'HY' 
    WHEN 1 THEN 'HN' 
    WHEN 3 THEN 'AY' 
    WHEN 3 THEN 'AN' 
END)

...但均无效。后者只返回设置备注 'HY' 的行,忽略 'HN' 的。

因此我正在寻找这样的东西:

(Admissions.Remark = CASE (RIGHT(@Session, 1)) 
    WHEN 1 THEN 'HY' OR 'HN' 
    WHEN 3 THEN 'AY' OR 'AN'
END)

有什么建议吗?我觉得我很接近它,但缺少一些部分。 谢谢!

我想这就是您要找的

Admissions.Remark = CASE 
    WHEN RIGHT(@Session, 1) = 1 AND ('HY', 'HN')
    WHEN RIGHT(@Session, 1) = 3 AND ('AY', 'AN')
END

您可以使用:

SELECT ...
FROM ...
WHERE 
   (CASE WHEN Admissions.Remark IN ('HY', 'HN') THEN 1 
         WHEN Admissions.Remark IN ('AY', 'AN') THEN 3
   END) = RIGHT(@Session, 1) 

你也可以试试下面的语句

SELECT ...
FROM ...
WHERE 
   ((Admissions.Remark  ='HY' OR Admission.Remark = 'HN') AND  RIGHT(@Session, 1) = 1)
    OR ((Admissions.Remark ='AY'OR Admission.Remark = 'AN') AND RIGHT(@Session, 1) = 3)