myCol
------
true
true
true
false
false
null
W powyższej tabeli, jeśli tak:
select count(*), count(myCol);
dostaję 6, 5
Otrzymuję, 5
ponieważ nie liczy wpisu zerowego.
Jak policzyć również liczbę prawdziwych wartości (w tym przykładzie 3)?
(To jest uproszczenie i w rzeczywistości używam znacznie bardziej skomplikowanego wyrażenia w funkcji count)
Podsumowanie edycji: chcę również uwzględnić w zapytaniu zwykłą liczbę (*), więc nie mogę użyć klauzuli where
sql
postgresql
EoghanM
źródło
źródło
WHERE myCol = true
jeśli chcesz, a jeśli usuniesz pierwszy*,
, po prostu zwróci liczbę.Odpowiedzi:
lub, jak sam się przekonałeś:
źródło
ELSE null
aby uzyskać ten sam wynik.Rzutuj wartość logiczną na liczbę całkowitą i sumę.
Masz
6,3
.źródło
Od PostgreSQL 9.4 istnieje
FILTER
klauzula , która pozwala na bardzo zwięzłe zapytanie w celu obliczenia prawdziwych wartości:Powyższe zapytanie jest złym przykładem, ponieważ wystarczyłaby prosta klauzula WHERE i służy ona jedynie do zademonstrowania składni. Klauzula FILTER świeci, ponieważ można ją łatwo połączyć z innymi agregatami:
Klauzula jest szczególnie przydatna w przypadku agregacji w kolumnie, która używa innej kolumny jako predykatu, umożliwiając jednocześnie pobieranie agregatów filtrowanych w różny sposób w jednym zapytaniu:
źródło
prawdopodobnie najlepszym podejściem jest użycie funkcji nullif.
ogólnie
lub w skrócie
http://www.postgresql.org/docs/9.0/static/functions-conditional.html
źródło
nullif([boolean expression], true)
zwróci,false
jeśli [wyrażenie logiczne] jest fałszywe, anull
jeśli jest prawdziwe, będziesz liczyć wartości fałszywe. Myślę, że chcesznullif([boolean expression], false)
.nullif([boolean expression], false)
, znacznie ułatwia czytanie. Następnie możesz zmienić część wyrażenia boolowskiego, aby była dowolna, w tym przypadku,myCol = true
aby policzyć wartości prawdziwe lubmyCol = false
zliczać wartości fałszywe lubname='john'
policzyć ludzi zwanych jan itp.Najkrótszym i najbardziej leniwym (bez odlewania) rozwiązaniem byłoby użycie wzoru:
Spróbuj sam:
daje taki sam wynik jak
źródło
W MySQL możesz to również zrobić:
Myślę, że w Postgres to działa:
lub lepiej (aby uniknąć :: i użyć standardowej składni SQL):
źródło
Albo może to
źródło
myCol
wyrażenie jest wartością logiczną, możesz zamienić czek nawhere (myCol)
Po prostu przekonwertuj pole logiczne na liczbę całkowitą i zrób sumę. To zadziała na postgresql:
Mam nadzieję, że to pomoże!
źródło
Oto sposób z funkcją okienkowania:
źródło
WHERE myCol = true
. Podałem drugi przykład nie dlatego, że jest szybszy, ale bardziej jako element edukacyjny dotyczący funkcji okienkowych Postgresa, z którymi wielu użytkowników nie czuje się komfortowo lub o których nie wie.zgrupuje 3 możliwe stany bool (fałsz, prawda, 0) w trzech wierszach, co jest szczególnie przydatne podczas grupowania z inną kolumną, np. dzień
źródło