pyon pyon - 4 months ago 18
SQL Question

Applying the MIN aggregate function to a BIT field

I want to write the following query:

SELECT ..., MIN(SomeBitField), ...
FROM ...
WHERE ...
GROUP BY ...


The problem is, SQL Server does not like it, when I want to calculate the minimum value of a bit field it returns the error
Operand data type bit is invalid for min operator
.

I could use the following workaround:

SELECT ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM ...
WHERE ...
GROUP BY ...


But, is there something more elegant? (For example, there might be an aggregate function, that I don't know, and that evaluates the logical
and
of the bit values in a field.)

JNK JNK
Answer

Since there are only two options for BIT, just use a case statement:

SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit'
FROM ...
WHERE ...

This has the advantage of:

  • Not forcing a table scan (indexes on BIT fields pretty much never get used)
  • Short circuiting TWICE (once for EXISTS and again for the CASE)

It is a little more code to write but it shouldn't be terrible. If you have multiple values to check you could always encapsulate your larger result set (with all the JOIN and FILTER criteria) in a CTE at the beginning of the query, then reference that in the CASE statements.

Comments