Jeg har muligvis fundet en løsning:
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
Tricket fungerer således:
- Omdan rækketypen til dens tekstrepræsentation.
- Mål tegnlængde.
- Erstat det tegn, du vil tælle, og mål ændringen i længden.
- Beregn længden af den oprindelige række i undervalget til gentagen brug.
Dette kræver, at P, F, I
findes ingen andre steder i rækken. Brug et undervalg til at udelukke andre kolonner, der kan forstyrre.
Testet i 8.4 - 9.1. Ingen bruger PostgreSQL 7.4 længere i dag, du bliver nødt til at teste dig selv. Jeg bruger kun grundlæggende funktioner, men jeg er ikke sikker på, om det er muligt at caste rækketypen til tekst i 7.4. Hvis det ikke virker, bliver du nødt til at sammenkæde alle testkolonner én gang i hånden:
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
Dette kræver, at alle kolonner er NOT NULL
.