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 andde 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:
BITcampos casi nunca se usan)EXISTSy 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
JOINyFILTER)CTEal comienzo de la consulta, luego haga referencia a eso en lasCASEdeclaraciones.fuente
bitsi es anulable.bitcolumna constaba completamente deNULLvalores,MINdebería regresarNULL.select 1 from ...subconsulta. No tiene mucho sentido.SELECT 1 FROM Outertable WHERE bitfield=1Una 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
CASEopció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 MyTableCuando 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