基于 CASE 语句的 WHERE 子句列

WHERE clause columns based on CASE statement

我 运行 遇到了一个问题,即如何处理 WHERE 子句,该子句将根据变量的值比较不同的列。

英语,这是我的目标:

SELECT 
    ...
FROM
    ...
WHERE
    [LaborDtl].[ClockInDate] BETWEEN @StartDate AND @EndDate
    AND
    /* (this is where I get lost) */
    CASE WHEN @SearchBy = R THEN [LaborDtl].[ResourceGroupID] IN (SELECT val FROM STRING_SPLIT(SELECT value FROM string_split(@SearchTerms, ','))
    ELSE [LaborDtl].[JCDepartment] IN (SELECT val FROM STRING_SPLIT(SELECT value FROM string_split(@SearchTerms, ','))   

基本上,如果@SearchBy = R,则显示@SearchTerms 列表中 ResourceGroupID 所在的行,否则显示@SearchTerms 列表中 JCDepartment 值所在的行。

我在某处看到 post 说你不能在 CASE 中使用 'IN' 语句,如果它在 WHERE 子句中,所以我想知道是否有人可以指出我解决此问题的另一种方法的正确方向。

where 子句中通常不需要

case 表达式。所以只需将逻辑重写为:

WHERE [LaborDtl].[ClockInDate] BETWEEN @StartDate AND @EndDate AND
      ((@SearchBy = 'R' AND
        [LaborDtl].[ResourceGroupID] IN (SELECT val FROM STRING_SPLIT(SELECT value FROM string_split(@SearchTerms, ','))
       ) OR
       (@SearchBy <> 'R' AND
        [LaborDtl].[JCDepartment] IN (SELECT val FROM STRING_SPLIT(SELECT value FROM string_split(@SearchTerms, ','))  
       ) 
      )