Vielleicht habe ich eine Lösung gefunden:
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
Der Trick funktioniert so:
- Wandle den Zeilentyp in seine Textdarstellung um.
- Zeichenlänge messen.
- Ersetzen Sie das zu zählende Zeichen und messen Sie die Längenänderung.
- Berechnen Sie die Länge der ursprünglichen Zeile in der Unterauswahl zur wiederholten Verwendung.
Dies erfordert, dass P, F, I
sind nirgendwo sonst in der Reihe vorhanden. Verwenden Sie eine Unterauswahl, um andere Spalten auszuschließen, die stören könnten.
Getestet in 8.4 - 9.1. Heutzutage verwendet niemand mehr PostgreSQL 7.4, das müssen Sie selbst testen. Ich verwende nur grundlegende Funktionen, bin mir aber nicht sicher, ob das Umwandeln des Zeilentyps in Text in 7.4 möglich ist. Wenn das nicht funktioniert, müssen Sie alle Test-Spalten einmal von Hand verketten:
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
Dazu müssen alle Spalten NOT NULL
sein .