WHERE IS NULL, NOT IS NULL or NO WHERE cláusula según el valor del parámetro de SQL Server

StackOverflow https://stackoverflow.com/questions/810714

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo un procedimiento almacenado en SQL Server 2000 que realiza una búsqueda basada en valores de parámetros. Para uno de los parámetros pasados, necesito una cláusula diferente WHERE dependiendo de su valor; el problema es que los 3 valores estarían donde MyColumn

  1. ES NULO
  2. NO ES NULO
  3. CUALQUIER VALOR (NULL Y NO NULL) (esencialmente no hay una cláusula WHERE )

Estoy teniendo un bloqueo mental para encontrar la sintaxis correcta. ¿Es posible hacer esto en una declaración de selección sin realizar alguna bifurcación de IF @parameter BEGIN ... END ?

¿Fue útil?

Solución

Aquí es cómo puede resolver esto usando una sola cláusula WHERE :

WHERE (@myParm = value1 AND MyColumn IS NULL)
OR  (@myParm = value2 AND MyColumn IS NOT NULL)
OR  (@myParm = value3)

Un uso ingenuo de la declaración CASE no funciona , con esto quiero decir lo siguiente:

SELECT Field1, Field2 FROM MyTable
WHERE CASE @myParam
    WHEN value1 THEN MyColumn IS NULL
    WHEN value2 THEN MyColumn IS NOT NULL
    WHEN value3 THEN TRUE
END

Es posible resolver esto usando una declaración de caso, vea un día cuando respuesta

Otros consejos

Podrías hacer algo como esto:

SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)

Algo así.

Así es como se puede hacer usando CASE :

DECLARE @myParam INT;
SET @myParam = 1;

SELECT * 
  FROM MyTable
 WHERE 'T' = CASE @myParam
             WHEN 1 THEN 
                CASE WHEN MyColumn IS NULL THEN 'T' END
             WHEN 2 THEN
                CASE WHEN MyColumn IS NOT NULL THEN 'T' END
             WHEN 3 THEN 'T' END;
WHERE MyColumn = COALESCE(@value,MyColumn) 
  • Si @value es NULL , comparará MyColumn consigo mismo, ignorando @value = no where cláusula.

  • SI @value tiene un valor ( NOT NULL ) comparará MyColumn con @value.

Referencia: COALESCE (Transact-SQL) .

Otra forma de CASE:

SELECT *  
FROM MyTable
WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL     THEN 1 
               WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1 
               WHEN @myParm = value3                          THEN 1 
          END

He tenido éxito con esta solución. Es casi como el de Patrick, con un pequeño giro. Puede utilizar estas expresiones por separado o en secuencia. Si el parámetro está en blanco, se ignorará y todos los valores de la columna en la que se mostrará su búsqueda, incluyendo NULLS.

SELECT * FROM MyTable
WHERE 
    --check to see if @param1 exists, if @param1 is blank, return all
    --records excluding filters below
(Col1 LIKE '%' + @param1 + '%' OR @param1 = '')
AND
    --where you want to search multiple columns using the same parameter
    --enclose the first 'OR' expression in braces and enclose the entire 
    --expression 
((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '')
AND
    --if your search requires a date you could do the following
(Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top