2012-04-24 11 views
7

Mi pregunta es: ¿puedo hacer las funciones de estas dos selecciones en una sola declaración y deshacerme de la IF?TSQL: Cómo usar la variable que podría ser nula o int en una única selección

DECLARE @recID INT; 

--Case 1 
SET @recID = null; 
--Case 2 
--SET @recID = 117; 

IF @recID is null 
BEGIN 
    select * from myTable WHERE [myIDcolumn] is null -- works when recID is null 
END 
ELSE 
BEGIN 
    select * from myTable WHERE [myIDcolumn] = @recID -- works when recID is number 
END 

Respuesta

10

¿Qué tal esto:

select * 
from myTable 
WHERE [myIDcolumn] = @recID or (@recID is null and [myIDcolumn] is null) 

Si @recID es null, la primera parte nunca será cierto, pero la segunda parte será si es [myIDcolumn]null, que cubre el caso null. Si @recID no es null, la primera parte coincidirá cuando corresponda (y la segunda parte será ignorada). Entonces, ambos casos están cubiertos.

+0

No olvide envolver todo entre paréntesis si está encadenando AND en su WHERE. '(...) WHERE myIDcolumn2 = TRUE AND ([myIDcolumn] = @recID o (@recID es nulo y [myIDcolumn] es nulo))' – Ullullu

2

Puede expresar la condición un poco diferente:

  • Cualquiera de los dos @recID y [myIDcolumn] debe haber null o
  • [myIDcolumn] debe ser igual a @recID

    seleccione * de myTable DONDE ([myIDcolumn] es nulo Y @recID es nulo) O [myIDcolumn] = @recID

Cuestiones relacionadas