萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL 技巧:用 REPLACE + LEN 快速統計長字串中某子字串出現次數

問題

給定字串 '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 時,差值除以目標長度得到次數。

效能考量

  • 純 SQL、無迴圈、無游標,集合運算效率高。
  • 大量資料時,建議在應用層或建立計算欄位/觸發器預先統計。

總結

REPLACE 雙倍替換 + LEN 差值,是統計子字串出現次數的經典集合型技巧,碼短、效能好、跨資料庫通用(僅改函式名)。

copyright © 萬盛學電腦網 all rights reserved