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
L1
panjang string dengan semua pengganti dihapusL2
untuk mendapatkanL3
perbedaan panjang string. - Bagi
L3
dengan 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');