Sql 当{expression}为空时,选择WHERE{column}=CASE
我有这个代码,它是存储过程的一部分Sql 当{expression}为空时,选择WHERE{column}=CASE,sql,sql-server,select,null,case,Sql,Sql Server,Select,Null,Case,我有这个代码,它是存储过程的一部分 INSERT INTO #TempTable /* A few subqueries, about 100 lines */ WHERE (cartera.ClaSucursal = @pIdSucursal OR @pIdSucursal = -1) AND (cartera.ClaAsesorActual = CASE WHEN @pIdAsesor > 0 THEN @pIdAsesor
INSERT INTO #TempTable
/* A few subqueries, about 100 lines */
WHERE (cartera.ClaSucursal = @pIdSucursal OR @pIdSucursal = -1)
AND (cartera.ClaAsesorActual =
CASE
WHEN @pIdAsesor > 0 THEN @pIdAsesor
WHEN @pIdAsesor = 0 THEN NULL
END
OR @pIdAsesor = -1)
/* Rest of my code, about 200 lines */
SELECT * FROM #TempTable
基本上,我有一个名为@pIdAsesor
的参数,根据其值,可能有三种结果
@pIdAsesor=-1
,它为我带来所有条目,而不考虑Id值@pIdAsesor=sumId
它为我带来所有具有给定Id的条目@pIdAsesor=0
这将为我带来Id为NULL的所有条目结果1和2可以完美地工作,但场景3不能返回结果。如果结果为空,但
=null
不起作用,则不能将=
用于null
。您必须使用is null
null
不是一个值,而是缺少它null
永远不等于任何值(甚至不等于另一个null
),但您可以使用is
运算符显式检查它
您可以舍弃case
表达式,用一系列或来构造此逻辑:
AND ((@pIdAsesor = -1) OR
(@PIdAsesor = 0 AND cartera.ClaAsesorActual IS NULL) OR
(@pIdAsesor = cartera.ClaAsesorActual))
也许…(@pIdAsesor>0和@pIdAsesor=cartera.claasesorreact)
可以避免任何其他负值?@总是在学习这是一个真正的需求问题。我在OP的代码中看到了@pIdAsesor>0
,但另一方面,要求“@pIdAsesor=sumId,它为我提供了所有具有给定Id的条目”似乎并不排除负Id。Mureinik是的!这三个场景都在运行!非常感谢你@一直以来,我都在学习,我不明白,你的意思是如果给我的话,它不会给我带来所有的结果,比如说-2?没有,我只是试过了。@ArturoLozano我们不知道你数据库的内容。我的评论是基于您的case子句当@pIdAsesor>0时,然后@pIdAsesor
,这表明@pIdAsesor
或卡特拉。claasesorreal
可能是负值,而不是-1
。如果这两个都不是其他负值,那么就不必担心了。@Always学习伟大的观察!幸运的是,它确实可以防止可能发生的灾难。ClaAsessorActual只能容纳大于0的正数。谢谢你的洞察力。