Saya sangat menyarankan untuk memeriksa jawaban yang saya posting ke "Bagaimana Anda menghitung kemunculan string berlabuh menggunakan PostgreSQL?" . Jawaban yang dipilih terbukti jauh lebih lambat daripada versi adaptasi regexp_replace() . Overhead untuk membuat baris, dan menjalankan agregat terlalu tinggi.
Cara tercepat untuk melakukannya adalah sebagai berikut...
SELECT
(length(str) - length(replace(str, replacestr, '')) )::int
/ length(replacestr)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr);
Di sini kita
- Ambil panjang string,
L1 - Kurangi dari
L1panjang string dengan semua pengganti dihapusL2untuk mendapatkanL3perbedaan panjang string. - Bagi
L3dengan lamanya penggantian untuk mendapatkan kejadian
Sebagai perbandingan, itu sekitar lima kali lebih cepat daripada metode menggunakan regexp_matches() yang terlihat seperti ini.
SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');