Chcę napisać następujące zapytanie:
SELECT ..., MIN(SomeBitField), ...
FROM ...
WHERE ...
GROUP BY ...
Problem w tym, że SQL Server tego nie lubi, gdy chcę obliczyć minimalną wartość pola bitowego , zwraca błąd Operand data type bit is invalid for min operator
.
Mogę zastosować następujące obejście:
SELECT ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM ...
WHERE ...
GROUP BY ...
Ale czy jest coś bardziej eleganckiego? (Na przykład może istnieć funkcja agregująca, której nie znam, i która ocenia logikę and
wartości bitów w polu).
sql
sql-server
tsql
pyon
źródło
źródło
Operand data type bit is invalid for min operator.
cast(min(SomeBitField+0) as bit)
Odpowiedzi:
Ponieważ istnieją tylko dwie opcje dla
BIT
, po prostu użyj instrukcji case:SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit' FROM ... WHERE ...
Ma to tę zaletę, że:
BIT
pól prawie nigdy nie są używane)EXISTS
i jeszcze raz zaCASE
)To trochę więcej kodu do napisania, ale nie powinno to być straszne. Jeśli masz wiele wartości do sprawdzenia, zawsze możesz zamknąć większy zestaw wyników (ze wszystkimi kryteriami
JOIN
iFILTER
) w aCTE
na początku zapytania, a następnie odwołać się do tego wCASE
instrukcjach.źródło
bit
jeśli dopuszcza wartość null.bit
kolumna składała się wyłącznie zNULL
wartości,MIN
powinna zostać zwróconaNULL
.select 1 from ...
podzapytania. To nie ma sensu.SELECT 1 FROM Outertable WHERE bitfield=1
Jedna opcja to
MIN(SomeBitField+0)
. Czyta się dobrze, z mniejszym hałasem (co określiłbym jako elegancję).To powiedziawszy, jest to bardziej hakerskie niż
CASE
opcja. I nie wiem nic o szybkości / wydajności.źródło
To zapytanie jest najlepszym rozwiązaniem:
SELECT CASE WHEN MIN(BitField+0) = 1 THEN 'True' ELSE 'False' END AS MyColumn FROM MyTable
Po dodaniu BitField + 0 automatycznie zmieni się w int
źródło
select min(convert(int, somebitfield))
lub jeśli chcesz zachować wynik jako bit
select convert(bit, min(convert(int, somebitfield)))
źródło
Wypróbuj następującą uwagę: Min reprezentuje I funkcję agregującą, Max reprezentuje funkcję agregującą
SELECT ..., MIN(case when SomeBitField=1 then 1 else 0 end), MIN(SomeBitField+0)... FROM ... WHERE ... GROUP BY ...
ten sam wynik
źródło
Ten mały fragment kodu zawsze działał ze mną jak urok:
źródło
AVG (CAST (boolean_column AS FLOAT)) OVER (...) AS BOOLEAN_AGGREGATE
Podaj rozmytą wartość logiczną:
1 oznacza, że to wszystko prawda;
0 oznacza, że wszystko jest fałszywe;
wartość między] 0..1 [wskazuje częściowe dopasowanie i może stanowić pewien procent prawdy.
źródło