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
子句以在出现意外情况时提供默认值。
我有以下工作代码:
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
子句以在出现意外情况时提供默认值。