FILTER
Postgres 9.4 ve sonraki sürümlerinde toplu fıkra
Postgres 9.4'ten beri temiz ve hızlı (SQL standardı) bir yol var:
SELECT count(*) FILTER (WHERE score BETWEEN 0 AND 3) AS low
, count(*) FILTER (WHERE score BETWEEN 4 AND 7) AS mid
, count(*) FILTER (WHERE score BETWEEN 8 AND 10) AS high
, count(*) AS total
FROM foo;
total
ekler low
, mid
ve high
NULL veya diğer değerler söz konusu olmadıkça,.
Bağlantılar:
Ayrıca aşağıda okuyun.
Postgres 9.3-
Birkaç teknik var:
@Phil , standart yolu bir CASE
açıklama ile sağladı (bunun dışında sum(1)
, standart yol değildir). Daha kısa bir form kullanmayı seviyorum:
SELECT count(score BETWEEN 0 AND 3 OR NULL) AS low
, count(score BETWEEN 4 AND 6 OR NULL) AS mid
, count(score BETWEEN 7 AND 10 OR NULL) AS high
, count(*) AS total
FROM foo;
Değerleriniz sorunuzda tanımlandığı gibiyse (yalnızca 0
- 10
mümkün), daha da basitleştirin:
SELECT count(score < 4 OR NULL) AS low
, count(score BETWEEN 4 AND 6 OR NULL) AS mid
, count(score > 6 OR NULL) AS high
, count(*) AS total
FROM foo;
Biraz daha kısa, ancak daha hızlı.
Ustaca farklılıklar
Orada küçük farklar karşılaştırıldığında sum()
içinde Phil cevap :
En önemlisi, belge başına :
count
Hiçbir satır seçilmediğinde, bu işlevler dışında null değer döndürdüğüne dikkat edilmelidir . Özellikle, sum
hiçbir satır null döndürmez, beklendiği gibi sıfır değil, ...
count(*)
olduğu standart yol ve biraz daha hızlı sum(1)
. Yine null vs. 0 uygulanır.
Bu sorguların her ikisi de (Phil dahil) null değerlerini sayar total
. Bu istenmiyorsa, bunun yerine şunu kullanın:
count(score) AS total_not_null
SQL Fiddle , sayfa 9.3.
db <> keman burada pg 10'da.