Quiero escribir la siguiente consulta:
SELECT ..., MIN(SomeBitField), ...
FROM ...
WHERE ...
GROUP BY ...
El problema es que a SQL Server no le gusta, cuando quiero calcular el valor mínimo de un campo de bits , devuelve el error Operand data type bit is invalid for min operator
.
Podría usar la siguiente solución:
SELECT ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM ...
WHERE ...
GROUP BY ...
Pero, ¿hay algo más elegante? (Por ejemplo, puede haber una función agregada, que no conozco, y que evalúa la lógica and
de los valores de bits en un campo).
sql
sql-server
tsql
pyon
fuente
fuente
Operand data type bit is invalid for min operator.
cast(min(SomeBitField+0) as bit)
Respuestas:
Dado que solo hay dos opciones para
BIT
, simplemente use una declaración de caso:SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit' FROM ... WHERE ...
Esto tiene la ventaja de:
BIT
campos casi nunca se usan)EXISTS
y otra vez para elCASE
)Es un poco más de código para escribir, pero no debería ser terrible. Si tiene varios valores para verificar, siempre puede encapsular su conjunto de resultados más grande (con todos los criterios
JOIN
yFILTER
)CTE
al comienzo de la consulta, luego haga referencia a eso en lasCASE
declaraciones.fuente
bit
si es anulable.bit
columna constaba completamente deNULL
valores,MIN
debería regresarNULL
.select 1 from ...
subconsulta. No tiene mucho sentido.SELECT 1 FROM Outertable WHERE bitfield=1
Una opción es
MIN(SomeBitField+0)
. Se lee bien, con menos ruido (lo que yo calificaría de elegancia).Dicho esto, es más hack-ish que la
CASE
opción. Y no sé nada sobre velocidad / eficiencia.fuente
Esta consulta es la mejor solución:
SELECT CASE WHEN MIN(BitField+0) = 1 THEN 'True' ELSE 'False' END AS MyColumn FROM MyTable
Cuando agrega BitField + 0, automáticamente se convierte en int
fuente
select min(convert(int, somebitfield))
o si quieres mantener el resultado como poco
select convert(bit, min(convert(int, somebitfield)))
fuente
Pruebe la siguiente nota: función mínima de representación y agregación, función máxima de representación o agregación
SELECT ..., MIN(case when SomeBitField=1 then 1 else 0 end), MIN(SomeBitField+0)... FROM ... WHERE ... GROUP BY ...
mismo resultado
fuente
Este pequeño fragmento de código siempre me ha funcionado como un encanto:
fuente
AVG (CAST (boolean_column AS FLOAT)) OVER (...) AS BOOLEAN_AGGREGATE
Dar un booleano difuso:
Indico que todo eso es cierto;
0 indica que todo es falso;
un valor entre] 0..1 [indica coincidencia parcial y puede ser un porcentaje de verdad.
fuente