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的正数。谢谢你的洞察力。