Potrei aver trovato una soluzione:
SELECT id
,l - length(replace(t, 'P', '')) AS nr_p
,l - length(replace(t, 'F', '')) AS nr_f
,l - length(replace(t, 'I', '')) AS nr_i
FROM (SELECT id, test::text AS t, length(test::text) AS l FROM test) t
Il trucco funziona così:
- Trasforma il tipo di riga nella sua rappresentazione testuale.
- Misura la lunghezza dei caratteri.
- Sostituisci il carattere che vuoi contare e misura la variazione di lunghezza.
- Calcola la lunghezza della riga originale nella sottoselezione per l'uso ripetuto.
Ciò richiede che P, F, I
non sono presenti da nessun'altra parte nella riga. Utilizza una sottoselezione per escludere qualsiasi altra colonna che potrebbe interferire.
Testato in 8.4 - 9.1. Nessuno usa più PostgreSQL 7.4 al giorno d'oggi, dovrai metterti alla prova. Uso solo funzioni di base, ma non sono sicuro che trasmettere il tipo di riga al testo sia fattibile in 7.4. Se ciò non funziona, dovrai concatenare tutte le colonne di test una volta a mano:
SELECT id
,length(t) - length(replace(t, 'P', '')) AS nr_p
,length(t) - length(replace(t, 'F', '')) AS nr_f
,length(t) - length(replace(t, 'I', '')) AS nr_i
FROM (SELECT id, test1||test2||test3||test4 AS t FROM test) t
Ciò richiede che tutte le colonne siano NOT NULL
.