給定字串 'X-BGS-2010-09-15-001',快速算出 '-' 出現幾次?逐字元掃描太慢、寫法繁瑣。
LEN(REPLACE(original_str, target_str, target_str + target_str)) - LEN(original_str)
原理:將目標子字串替換為「兩倍長度」,整體長度增加量恰好等於「出現次數 × 目標長度」。若目標長度為 1,長度差即為次數。
DECLARE @a VARCHAR(100) = 'X-BGS-2010-09-15-001';
SELECT LEN(REPLACE(@a, '-', '--')) - LEN(@a); -- 回傳 6
'-' 出現 6 次,替換後字串變長 6 字元,差值即 6。
-- 統計表 a 中欄位 b 含有字母 'c' 的次數
SELECT LEN(REPLACE(b, 'c', 'cc')) - LEN(b) AS c_count FROM a;
注意:不同資料庫長度函式名稱不同(MySQL 用 LENGTH()/CHAR_LENGTH(),SQL Server 用 LEN(),PostgreSQL 用 LENGTH()),請依實際平台調整。
-- 統計 'abc' 出現次數
SELECT (LEN(REPLACE(str, 'abc', 'abcabc')) - LEN(str)) / LEN('abc') AS cnt FROM t;
目標長度 > 1 時,差值除以目標長度得到次數。
REPLACE 雙倍替換 + LEN 差值,是統計子字串出現次數的經典集合型技巧,碼短、效能好、跨資料庫通用(僅改函式名)。