Pregunta

consulta simple, hasta imposible, pero sé que hay algunas personas inteligentes por ahí:)

Dado un parámetro booleano, quiero definir mi cláusula de dónde sea limitar la producción de una determinada columna -. O no hacer nada

Así que, dado parámetro @bit = 1 esto sería el resultado:

donde la columna = 1

parámetro dado @bit = 0 este sería el resultado:

donde la columna = 1 o 0

es decir. no tienen ningún efecto / mostrar todos los resultados (columna es un campo de bit)

No estoy queriendo SQL dinámico -. Puedo conformarse con la fijación del mismo en el código, pero me preguntaba si hay algo de magia inteligente que haría que el anterior ordenada y sencilla

¿Hay? Estoy usando SQL Server.

aplausos: D

¿Fue útil?

Solución

La respuesta column = 1 or @bit = 0 funciona si columna sólo puede ser 0 o 1. Si la columna puede ser cualquier valor que desee:. column = 1 or @bit = 0 and column = 0

Otros consejos

SELECT  *
FROM    mytable
WHERE   column = 1 OR @bit = 0

Si usted tiene un índice en column1, éste será más eficiente:

SELECT  *
FROM    mytable
WHERE   column = 1 AND @bit = 1
UNION ALL
SELECT  *
FROM    mytable
WHERE   @bit = 0

Lee este artículo en mi blog para comparación de rendimiento de un WHERE sola condición vs UNION ALL:

where column BETWEEN @bit AND 1
select *
from   MyTable
where (@bit = 0 OR MyColumn = 1)
select ...
from [table]
where @bit = 0 or (column = @bit)

Yo había llegado con una respuesta diferente y se sentía tonto al ver la respuesta de consenso. Por lo tanto, sólo para yucks, en comparación con los dos usando mi propia base de datos. Realmente no sé si son realmente comparables, pero mis planes de ejecución a dar una ligera ventaja a mi respuesta tonta:

SELECT *
de MiTabla
donde la columna <> caso @bit cuando 1 entonces 0 otro -1 final

Me doy cuenta de índices, tamaño de la tabla, etc., pueden afectar a este.
Además, se dio cuenta, probablemente, no se puede comparar un poco a un -1 ...
Sólo pensé en compartir.

Probar

 select ...
 from table
 where column = case when @bit = 0 then 0 else column end

esto funciona sin importar el tipo de datos de columna es (incluso podría ser una cadena, por ejemplo). Si lo fuera, por supuesto, sería un valor predeterminado diferente (no 0)

Cuando en la columna> = @bit

Sin embargo, esto sólo funciona para> 0 valores en una columna numérica. @bit se convierte implícitamente a int, smallint, etc, debido a tipo de datos precedencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top