myCol
------
true
true
true
false
false
null
Wenn ich in der obigen Tabelle Folgendes tue:
select count(*), count(myCol);
Ich bekomme 6, 5
Ich bekomme, 5
da es den Null-Eintrag nicht zählt.
Wie zähle ich auch die Anzahl der wahren Werte (3 im Beispiel)?
(Dies ist eine Vereinfachung und ich verwende tatsächlich einen viel komplizierteren Ausdruck innerhalb der Zählfunktion.)
Zusammenfassung bearbeiten: Ich möchte auch eine einfache Anzahl (*) in die Abfrage aufnehmen, kann daher keine where-Klausel verwenden
sql
postgresql
EoghanM
quelle
quelle
WHERE myCol = true
wenn Sie möchten, und wenn Sie das erste entfernen*,
, wird nur die Nummer zurückgegeben.Antworten:
oder, wie Sie selbst herausgefunden haben:
quelle
ELSE null
, um das gleiche Ergebnis zu erhalten.Wandle den Booleschen Wert in eine ganze Zahl und eine Summe um.
Du verstehst
6,3
.quelle
Seit PostgreSQL 9.4 gibt es die
FILTER
Klausel , die eine sehr präzise Abfrage ermöglicht, um die wahren Werte zu zählen:Die obige Abfrage ist insofern ein schlechtes Beispiel, als eine einfache WHERE-Klausel ausreichen würde und nur zur Demonstration der Syntax dient. Die FILTER-Klausel zeigt, dass es einfach ist, sie mit anderen Aggregaten zu kombinieren:
Die Klausel ist besonders praktisch für Aggregate in einer Spalte, die eine andere Spalte als Prädikat verwendet, und ermöglicht gleichzeitig das Abrufen unterschiedlich gefilterter Aggregate in einer einzelnen Abfrage:
quelle
Wahrscheinlich ist der beste Ansatz die Verwendung der Nullif-Funktion.
allgemein
oder kurz gesagt
http://www.postgresql.org/docs/9.0/static/functions-conditional.html
quelle
nullif([boolean expression], true)
gibt zurück,false
wenn [boolescher Ausdruck] falsch ist, undnull
wenn es wahr ist, werden Sie die falschen Werte zählen. Ich denke du willstnullif([boolean expression], false)
.nullif([boolean expression], false)
es viel einfacher ist, es so umzuformulieren, dass Sie es immer haben . Sie können dann den booleschen Ausdrucksteil so variieren, wie Sie möchten, in diesem FallmyCol = true
um wahre Werte odermyCol = false
falsche Werte zu zählen, odername='john'
zu zählen um Leute mit dem Namen John usw. zu zählenDie kürzeste und faulste Lösung (ohne Gießen) wäre die Verwendung der folgenden Formel:
Versuch es selber:
gibt das gleiche Ergebnis als
quelle
In MySQL können Sie dies auch tun:
Ich denke, dass dies in Postgres funktioniert:
oder besser (um :: zu vermeiden und die Standard-SQL-Syntax zu verwenden):
quelle
Oder vielleicht das hier
quelle
myCol
Ausdruck ein Boolescherwhere (myCol)
Konvertieren Sie einfach das boolesche Feld in eine Ganzzahl und machen Sie eine Summe. Dies funktioniert auf postgresql:
Hoffentlich hilft das!
quelle
Hier ist ein Weg mit der Fensterfunktion:
quelle
WHERE myCol = true
. Ich habe das zweite Beispiel nicht bereitgestellt, weil es schneller ist, sondern eher als Lehrmaterial für die Fensterfunktionen von Postgres, mit denen viele Benutzer nicht vertraut sind oder die sie nicht kennen.gruppiert die 3 möglichen Zustände von bool (false, true, 0) in drei Zeilen, was besonders praktisch ist, wenn Sie zusammen mit einer anderen Spalte wie day gruppieren
quelle