consulta SQL - true => verdadero, falso => verdadero o falso
-
20-08-2019 - |
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
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
:
- EN SQL Server : con una lista separada por comas
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.