Jag kanske har kommit på 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 fungerar så här:
- Omvandla radtypen till dess textrepresentation.
- Mät teckenlängden.
- Byt ut det tecken du vill räkna och mät längdförändringen.
- Beräkna längden på den ursprungliga raden i undervalet för upprepad användning.
Detta kräver att P, F, I
finns ingen annanstans i raden. Använd ett underval för att utesluta andra kolumner som kan störa.
Testad i 8.4 - 9.1. Ingen använder PostgreSQL 7.4 längre nuförtiden, du måste testa dig själv. Jag använder bara grundläggande funktioner, men jag är inte säker på om det är möjligt att casta radtypen till text i 7.4. Om det inte fungerar måste du sammanfoga alla testkolumner en gång för hand:
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
Detta kräver att alla kolumner är NOT NULL
.