Sql server SQL Server TSQL-如何实现;不在「;案件中的陈述
我有以下工作代码:Sql server SQL Server TSQL-如何实现;不在「;案件中的陈述,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有以下工作代码: INSERT INTO #resultado SELECT 1, v.idReqVoucher, v.dtSolicitacao, v.idFuncionario_solicitante, v.idFuncionario_beneficiario, v.idStatus, NULL as valor FROM reqVoucher v
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
我不知道如何在我的代码中实现这一点。我对TSQL和SQL Server还不太熟悉,所以请温和一点。这应该相当于您想要的:
AND (
(@status = 99) AND (v.idStatus NOT IN (5,1,4,20))
OR
(@status <> 99) AND (@status <> 0) AND (v.idStatus = @status)
)
和(
(@status=99)和(v.idStatus不在(5,1,4,20))
或
(@status 99)和(@status 0)以及(v.idStatus=@status)
)
CASE
表达式只能用于返回标量值,因此不能用于返回类似NOT IN(5,1,4,20)
的谓词。这应该与您想要的等价:
AND (
(@status = 99) AND (v.idStatus NOT IN (5,1,4,20))
OR
(@status <> 99) AND (@status <> 0) AND (v.idStatus = @status)
)
和(
(@status=99)和(v.idStatus不在(5,1,4,20))
或
(@status 99)和(@status 0)以及(v.idStatus=@status)
)
CASE
表达式只能用于返回标量值,因此它不能用于返回类似NOT IN(5,1,4,20)
的谓词CASE语句返回值,它不会通过更改SQL查询充当IF语句(如果是,则执行该操作)。您需要将where语句修改为以下内容:
AND (
(@status = 99 AND v.idStatus NOT IN (5, 1, 4, 20))
OR (@status NOT IN (0, 99) AND v.idStatus = @status)
)
编辑:Commenter是正确的,第二次检查需要确保@status不是99。CASE语句返回一个值,它不会通过更改SQL查询充当IF语句(如果是,则执行该操作)。您需要将where语句修改为以下内容:
AND (
(@status = 99 AND v.idStatus NOT IN (5, 1, 4, 20))
OR (@status NOT IN (0, 99) AND v.idStatus = @status)
)
编辑:Commenter是正确的,第二次检查需要确保@status不是99。或使用
CASE
表达式:
CASE
表达式返回一个必须使用的值,例如,将其与1
进行比较。如果出现意外情况,通常最好包含ELSE
子句以提供默认值。或使用CASE
表达式:
CASE
表达式返回一个必须使用的值,例如,将其与1
进行比较。如果出现意外情况,通常最好包含ELSE
子句以提供默认值。您好。谢谢你的快速回复。我得到了以下错误:Msg 102,级别15,状态1,过程sp_buscaTodasRequisicoes,第180行“')附近的语法不正确。Msg 102,15级,状态1,程序sp_BuscatodasRequesties,第1106行“结束”附近语法不正确编辑:我的中断行未显示在响应字段中,奇怪。@BrunoAlbuquerque括号匹配错误。请检查我的编辑。你好。谢谢你的快速回复。我得到了以下错误:Msg 102,级别15,状态1,过程sp_buscaTodasRequisicoes,第180行“')附近的语法不正确。Msg 102,15级,状态1,程序sp_BuscatodasRequesties,第1106行“结束”附近语法不正确编辑:我的中断行未显示在响应字段中,奇怪。@BrunoAlbuquerque括号匹配错误。请检查我所做的编辑。如果@status=99
和v.idStatus=99
,则上述结果将计算为true
,这与OP中引用的案例
伪代码的结果相矛盾。如果@status=99
和v.idStatus=99
,则上述结果将计算为true
,这与OP中引用的案例
伪代码的结果相矛盾。