【问题标题】:SELECT WHERE {column} = CASE WHEN {expression} THEN NULLSELECT WHERE {column} = CASE WHEN {expression} THEN NULL
【发布时间】:2020-03-19 21:22:36
【问题描述】:

我有这段代码,它是存储过程的一部分

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 的参数,根据它的值可能有三种可能的结果。

  1. @pIdAsesor = -1 无论 Id 值如何,它都会为我带来所有条目
  2. @pIdAsesor = sumId 给我带来了所有具有给定 ID 的条目
  3. @pIdAsesor = 0 这给我带来了所有以 NULL 作为 Id 的条目

结果 1 和 2 完美无缺,但方案 3 并没有带来结果。

【问题讨论】:

    标签: sql sql-server select null case


    【解决方案1】:

    null 不是一个值 - 它是缺少它。 null 永远不等于任何东西(甚至不等于另一个 null),但您可以使用 is 运算符明确地检查它。

    您可以抛弃case 表达式并使用一系列ors 构建此逻辑:

    AND      ((@pIdAsesor = -1) OR
              (@PIdAsesor = 0 AND cartera.ClaAsesorActual IS NULL) OR
              (@pIdAsesor = cartera.ClaAsesorActual))
    

    【讨论】:

    • 也许...(@pIdAsesor > 0 and @pIdAsesor = cartera.ClaAsesorActual) 以避免任何其他负值?
    • @AlwaysLearning 这确实是一个需求问题。我在 OP 的代码中看到 @pIdAsesor > 0,但另一方面,要求“@pIdAsesor = sumId 为我带来所有具有给定 ID 的条目”似乎并不排除负 ID。
    • 穆雷尼克 是的!所有三种情况都有效!非常感谢! @AlwaysLearning,我不明白,你的意思是它不会给我带来所有结果,如果给定让我们说-2?没有,我刚试过。
    • @ArturoLozano 我们不知道您数据库的内容。我的评论基于您的案例条款WHEN @pIdAsesor > 0 THEN @pIdAsesor,这表明@pIdAsesorcartera.ClaAsesorActual 有可能成为除-1 之外的负值。如果这些都不是其他负值,则无需担心。
    • @AlwaysLearning 很好的观察!它确实可以防止可能的灾难,幸运的是cartera.ClaAsessorActual 只包含大于 0 的正数。感谢您的洞察力。
    【解决方案2】:

    如果结果为空但= null 不起作用,则不能将= 用于null。你必须使用is null

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-30
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多