Ich möchte folgende Abfrage schreiben:
SELECT ..., MIN(SomeBitField), ...
FROM ...
WHERE ...
GROUP BY ...
Das Problem ist, SQL Server mag es nicht, wenn ich den Mindestwert eines Bitfeldes berechnen möchte, gibt es den Fehler zurück Operand data type bit is invalid for min operator
.
Ich könnte die folgende Problemumgehung verwenden:
SELECT ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM ...
WHERE ...
GROUP BY ...
Aber gibt es etwas eleganteres? (Zum Beispiel könnte es eine Aggregatfunktion geben, die ich nicht kenne und die die Logik and
der Bitwerte in einem Feld auswertet .)
sql
sql-server
tsql
pyon
quelle
quelle
Operand data type bit is invalid for min operator.
cast(min(SomeBitField+0) as bit)
Antworten:
Da es nur zwei Optionen gibt
BIT
, verwenden Sie einfach eine case-Anweisung:SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit' FROM ... WHERE ...
Dies hat den Vorteil von:
BIT
Felder werden so gut wie nie verwendet)EXISTS
und wieder fürCASE
)Es ist etwas mehr Code zum Schreiben, aber es sollte nicht schrecklich sein. Wenn Sie mehrere Werte überprüfen müssen, können Sie Ihre größere Ergebnismenge (mit allen
JOIN
undFILTER
Kriterien) immer in aCTE
am Anfang der Abfrage einkapseln und auf diese in denCASE
Anweisungen verweisen .quelle
bit
wenn es nullbar ist.bit
Spalte vollständig ausNULL
Werten bestand,MIN
sollte zurückgegeben werdenNULL
.select 1 from ...
Unterabfrage gesehen. Das macht nicht ganz Sinn.SELECT 1 FROM Outertable WHERE bitfield=1
Eine Option ist
MIN(SomeBitField+0)
. Es liest sich gut, mit weniger Lärm (was ich als Eleganz bezeichnen würde).Das heißt, es ist mehr hack-ish als die
CASE
Option. Und ich weiß nichts über Geschwindigkeit / Effizienz.quelle
Diese Abfrage ist die beste Lösung:
SELECT CASE WHEN MIN(BitField+0) = 1 THEN 'True' ELSE 'False' END AS MyColumn FROM MyTable
Wenn Sie das BitField + 0 hinzufügen, wird es automatisch wie int
quelle
select min(convert(int, somebitfield))
oder wenn Sie das Ergebnis als Bit behalten möchten
select convert(bit, min(convert(int, somebitfield)))
quelle
Versuchen Sie Folgendes : Hinweis: Min. Repräsentieren und Aggregatfunktion, Max. Repräsentieren oder Aggregatfunktion
SELECT ..., MIN(case when SomeBitField=1 then 1 else 0 end), MIN(SomeBitField+0)... FROM ... WHERE ... GROUP BY ...
gleiches Ergebnis
quelle
Dieser kleine Code hat bei mir immer wie ein Zauber gewirkt:
quelle
AVG (CAST (boolean_column AS FLOAT)) OVER (...) AS BOOLEAN_AGGREGATE
Geben Sie einen Fuzzy-Booleschen Wert an:
Ich gebe an, dass das alles wahr ist.
0 zeigt an, dass alles falsch ist;
Ein Wert zwischen] 0..1 [zeigt eine teilweise Übereinstimmung an und kann ein Prozentsatz der Wahrheit sein.
quelle