-- 原本 LIKE 寫法
SELECT * FROM table1 WHERE username LIKE '%c%';
-- CHARINDEX 寫法
SELECT * FROM table1 WHERE CHARINDEX('c', username) > 0;
CHARINDEX 回傳找到位置(1-based),未找到回傳 0。> 0 即代表「包含」。
LIKE 需轉義 %、_、[ 等,CHARINDEX 完全不受影響:
-- 找出含 % 號的帳號
SELECT * FROM table1 WHERE CHARINDEX('%', username) > 0;
-- 也可用 ASCII 碼
SELECT * FROM table1 WHERE CHARINDEX(CHAR(37), username) > 0; -- 37 = '%'
CHARINDEX 多一個 > 0 判斷,但 CPU 成本極低。LIKE 'abc%'),優化器仍可用 Index Seek;CHARINDEX 同樣可被 SARGable 改寫。| 場景 | 建議 |
|---|---|
| 固定字首/字尾搜尋、需索引 Seek | 優先用 LIKE |
| 搜尋模式含大量特殊字元、動態組裝 | CHARINDEX 更簡潔 |
| 程式碼可讀性優先、團隊習慣 | 統一風格即可 |
掌握 CHARINDEX,讓特殊字元搜尋不再頭痛!