Ik heb misschien een oplossing bedacht:
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
De truc werkt als volgt:
- Transform het rijtype in zijn tekstrepresentatie.
- Meet de tekenlengte.
- Vervang het teken dat je wilt tellen en meet de verandering in lengte.
- Bereken de lengte van de originele rij in de subselectie voor herhaald gebruik.
Dit vereist dat P, F, I
zijn nergens anders in de rij aanwezig. Gebruik een subselectie om andere kolommen uit te sluiten die mogelijk interfereren.
Getest in 8.4 - 9.1. Niemand gebruikt PostgreSQL 7.4 meer tegenwoordig, je zult jezelf moeten testen. Ik gebruik alleen basisfuncties, maar ik weet niet zeker of het casten van het rowtype naar tekst haalbaar is in 7.4. Als dat niet werkt, moet je alle testkolommen een keer met de hand aaneenschakelen:
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
Dit vereist dat alle kolommen NOT NULL
zijn .