SQL 服务器 TSQL - 如何在 CASE 中实现 "NOT IN" 语句

SQL Server TSQL - How to achieve "NOT IN" statements within a CASE

我有以下工作代码:

    INSERT INTO #resultado

    SELECT  1,

        v.idReqVoucher,
        v.dtSolicitacao,
        v.idFuncionario_solicitante,
        v.idFuncionario_beneficiario,
        v.idStatus,         
        NULL as valor
    FROM reqVoucher v
    WHERE
         v.idReqVoucher =  
            CASE WHEN @idRequisicao = 0 THEN v.idReqVoucher
            ELSE @idRequisicao END
        AND v.idStatus =  
            CASE WHEN @status = 0 THEN v.idStatus
            ELSE @status END

        AND v.dtSolicitacao >= CASE WHEN @dtSolicitacaoIni IS NULL THEN v.dtSolicitacao ELSE  @dtSolicitacaoIni END
        AND v.dtSolicitacao <= CASE WHEN @dtSolicitacaoFim IS NULL THEN v.dtSolicitacao ELSE  @dtSolicitacaoFim+' 23:59:59' END

但我需要实现的是这样的:

AND v.idStatus  
CASE WHEN @status = 99 THEN NOT IN (5,1,4,20)
ELSE WHEN @status != 0 THEN = @status END

而且我不知道如何在我的代码中实现这一点。我是 TSQL 和 SQL 服务器的新手,所以请保持温柔。

这应该相当于你想要的:

 AND (
      (@status = 99) AND (v.idStatus NOT IN (5,1,4,20))
      OR
      (@status <> 99) AND (@status <> 0) AND (v.idStatus = @status)
     )

CASE 表达式只能用于 return 标量值,因此不能用于 return 像 NOT IN (5,1,4,20).

这样的谓词

CASE 语句 returns 一个值,它不作为 IF 语句通过更改 SQL 查询(如果这样,那么做那样)。您需要将 where 语句修改为如下内容:

AND (
       (@status = 99 AND v.idStatus NOT IN (5, 1, 4, 20))
       OR (@status NOT IN (0, 99) AND v.idStatus = @status)
     )

编辑:评论者正确,第二次检查需要确保@status 不是 99。

或使用CASE 表达式:

and case
  when @status = 99 and v.idStatus not in ( 5, 1, 4, 20 ) then 1
  when @status !=0 and v.idStatus = @status then 1
  else 0
  end = 1

CASE 表达式 returns 您必须使用的值,例如通过将其与 1 进行比较。通常好的做法是包含一个 ELSE 子句以在出现意外情况时提供默认值。