Tengo un problema al usar una instrucción CASE WHEN porque donde la columna es el valor de la cadena tengo que usar el signo igual como este

SELECT * 
FROM table
WHERE (field = (CASE WHEN @PaidStatus = 1 THEN 'HELLO' ELSE NULL END) 

Pero el valor nulo no se puede comparar con el operador igual (necesito escribir WHERE field IS NULL no WHERE field = NULL).

Entonces, ¿cómo podría hacer esto?

0
doflamingo 9 sep. 2018 a las 11:03

3 respuestas

La mejor respuesta

¿Esto hará el truco?

SELECT * 
FROM table
WHERE (field = 'HELLO' AND @PaidStatus = 1)
   OR (field IS NULL AND @PaidStatus <> 1)
3
marc_s 9 sep. 2018 a las 08:51

Para devolver solo filas donde field = valor del parámetro, O, todas las filas si el parámetro es NULL, entonces:

SELECT * 
FROM table
WHERE (field = @PaidStatus OR @PaidStatus IS NULL)

Para otras combinaciones, como el valor del parámetro es 1, el campo es igual a 'HOLA' o todas las filas si el parámetro es nulo:

SELECT * 
FROM table
WHERE ((field = 'HELLO' AND @PaidStatus = 1) OR @PaidStatus IS NULL)

Tenga cuidado con los paréntesis, es posible que la sangría lo haga mucho más fácil de entender, p.

SELECT * 
FROM table
WHERE (
         (field = 'HELLO' AND @PaidStatus = 1) 
      OR (field = 'GOODBYE' AND @PaidStatus = 2) 
      OR @PaidStatus IS NULL
      )
1
Used_By_Already 9 sep. 2018 a las 08:11

Para que la sintaxis con el caso funcione?
Un CASE devuelve un valor y puede tener múltiples WHEN.
Para que pueda comparar con el valor devuelto.

SELECT * 
FROM table
WHERE 
(CASE 
 WHEN @PaidStatus = 1 AND field = 'HELLO' THEN 1
 WHEN field IS NULL THEN 2
 ELSE 0
 END) > 0

Lo que puede ser útil si tiene muchos criterios diferentes para poner en CASE.
Pero si solo son 2, simplemente usar OR será más corto.

SELECT * 
FROM table
WHERE (field IS NULL OR (@PaidStatus = 1 AND field = 'HELLO'));
0
LukStorms 9 sep. 2018 a las 08:27