SELECT WHERE {столбец} = CASE WHEN {выражение} THEN NULL - PullRequest
1 голос
/ 20 марта 2020

У меня есть этот код, который является частью хранимой процедуры

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 как Идентификатор

Результаты 1 и 2 работают безупречно, но сценарий 3 не возвращает результатов.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

null не значение, а его отсутствие. null никогда не равно чему-либо (даже другому null), но вы можете проверить это явно с помощью оператора is.

Вы можете отказаться от выражения case и построить эту логику c с серией or с:

AND      ((@pIdAsesor = -1) OR
          (@PIdAsesor = 0 AND cartera.ClaAsesorActual IS NULL) OR
          (@pIdAsesor = cartera.ClaAsesorActual))
0 голосов
/ 20 марта 2020

Вы не можете использовать = для null в случае, если результат равен нулю, но = null не работает. Вы должны использовать is null.

...