基于CASE语句的WHERE子句列

时间:2019-07-24 14:05:42

标签: sql sql-server where-clause 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,则向我显示ResourceGroupID在@SearchTerms列表中的行,否则向我显示JCDepartment值在@SearchTerms列表中的行。

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

1 个答案:

答案 0 :(得分:2)

case子句通常不需要

where表达式。因此,只需将逻辑重写为:

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, ','))  
       ) 
      )