Я хочу написать такой запрос:
SELECT ..., MIN(SomeBitField), ...
FROM ...
WHERE ...
GROUP BY ...
Проблема в том, что SQL Server не любит, когда я хочу вычислить минимальное значение битового поля, он возвращает ошибку Operand data type bit is invalid for min operator
.
Я мог бы использовать следующий обходной путь:
SELECT ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM ...
WHERE ...
GROUP BY ...
Но есть ли что-нибудь более элегантное? (Например, может быть агрегатная функция, о которой я не знаю, и которая оценивает логические and
значения битов в поле.)
sql
sql-server
tsql
Pyon
источник
источник
Operand data type bit is invalid for min operator.
cast(min(SomeBitField+0) as bit)
Ответы:
Поскольку есть только два варианта
BIT
, просто используйте оператор case:SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit' FROM ... WHERE ...
Это имеет преимущество:
BIT
полях практически никогда не используются)EXISTS
и снова дляCASE
)Это еще немного кода, но он не должен быть ужасным. Если у вас есть несколько значений , чтобы проверить , вы всегда можете инкапсулировать больший набор результатов (со всеми
JOIN
иFILTER
критериями) вCTE
начале запроса, то ссылки , что вCASE
отчетности.источник
bit
если он допускает значение NULL.bit
столбец полностью состоит изNULL
значений, онMIN
должен вернутьсяNULL
.select 1 from ...
подзапроса. Это не совсем понятно.SELECT 1 FROM Outertable WHERE bitfield=1
Один вариант есть
MIN(SomeBitField+0)
. Он хорошо читается, с меньшим шумом (что я бы назвал элегантностью).Тем не менее, это более хакерский
CASE
вариант, чем вариант. И я ничего не знаю о скорости / эффективности.источник
Этот запрос - лучшее решение:
SELECT CASE WHEN MIN(BitField+0) = 1 THEN 'True' ELSE 'False' END AS MyColumn FROM MyTable
Когда вы добавляете BitField + 0, он автоматически становится как int
источник
select min(convert(int, somebitfield))
или если вы хотите сохранить результат как бит
select convert(bit, min(convert(int, somebitfield)))
источник
Попробуйте следующее примечание: Min представляет и агрегатную функцию, Max представляет или агрегатную функцию
SELECT ..., MIN(case when SomeBitField=1 then 1 else 0 end), MIN(SomeBitField+0)... FROM ... WHERE ... GROUP BY ...
тот же результат
источник
Этот небольшой фрагмент кода всегда работал со мной как шарм:
источник
AVG (CAST (логический_столбец AS FLOAT)) OVER (...) AS BOOLEAN_AGGREGATE
Задайте нечеткое логическое значение:
1 означает, что все верно;
0 означает, что все это ложь;
значение между] 0..1 [указывает на частичное совпадение и может составлять некоторый процент истинности.
источник