Saya mungkin telah menemukan solusi:
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
Triknya bekerja seperti ini:
- Ubah tipe baris menjadi representasi teksnya.
- Mengukur panjang karakter.
- Ganti karakter yang ingin Anda hitung dan ukur perubahan panjangnya.
- Hitung panjang baris asli dalam subpilihan untuk penggunaan berulang.
Ini membutuhkan P, F, I
tidak ada di tempat lain di baris. Gunakan sub-pilihan untuk mengecualikan kolom lain yang mungkin mengganggu.
Diuji dalam 8.4 - 9.1. Tidak ada yang menggunakan PostgreSQL 7.4 lagi saat ini, Anda harus menguji diri sendiri. Saya hanya menggunakan fungsi dasar, tetapi saya tidak yakin apakah casting rowtype ke teks layak dilakukan di 7.4. Jika tidak berhasil, Anda harus menggabungkan semua kolom uji satu kali dengan tangan:
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
Ini mengharuskan semua kolom menjadi NOT NULL
.