nullif not ejemplos ejemplo sql sql-server sql-server-2000

sql - not - isnull oracle



La cláusula WHERE IS NULL, NOT NOT NULL o NO WHERE según el valor del parámetro SQL Server (6)

Aquí es cómo puede resolver esto utilizando 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 sentencia CASE no funciona , me refiero a 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 la answer

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 WHERE diferente según su valor. El problema es que los 3 valores serían donde MyColumn

  1. IS NULL
  2. IS NOT NULL
  3. ANY VALUE (NULL AND NOT NULL) (esencialmente ninguna cláusula WHERE )

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


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;


He tenido éxito con esta solución. Es casi como la 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, incluido 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 = '''')


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


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 como eso.


WHERE MyColumn = COALESCE(@value,MyColumn)

  • Si @value es NULL , comparará MyColumn con sí mismo, ignorando @value = no where cláusula @value = no where .

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

Referencia: COALESCE (Transact-SQL) .