Tôi thực sự khuyên bạn nên kiểm tra câu trả lời này mà tôi đã đăng cho "Làm cách nào để bạn đếm số lần xuất hiện của một chuỗi cố định bằng PostgreSQL?" . Câu trả lời đã chọn được chứng minh là chậm hơn nhiều so với phiên bản điều chỉnh của regexp_replace()
. Chi phí tạo các hàng và chạy tổng hợp chỉ đơn giản là quá cao.
Cách nhanh nhất để thực hiện việc này như sau ...
SELECT
(length(str) - length(replace(str, replacestr, '')) )::int
/ length(replacestr)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr);
Đây chúng tôi
- Lấy độ dài của chuỗi,
L1
- Trừ
L1
độ dài của chuỗi với tất cả các thay thế bị xóaL2
để lấyL3
sự khác biệt về độ dài chuỗi. - Chia
L3
theo khoảng thời gian thay thế để nhận được các lần xuất hiện
Để so sánh, nhanh hơn khoảng năm lần so với phương pháp sử dụng regexp_matches()
trông giống như thế này.
SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');