表 A 欄位 name 存逗號分隔字串('lu,li,zhang'),表 B 有名單(li, lu, zhou, zhang)。需查 A 中包含 B 名單中任一名字的行,且 B 篩選 sex=1。
SELECT * FROM A
WHERE A.name LIKE (SELECT B.name FROM B WHERE B.sex = 1);
-- 子查詢返回多行,LIKE 不支援集合比較
CHARINDEX + 連接SELECT DISTINCT a.no, a.name
FROM A a
JOIN B b ON CHARINDEX(b.name, a.name) > 0
WHERE b.sex = 1;
CHARINDEX(sub, str) 返回子串首次出現位置(1-based),0 表不含DISTINCT 去重:一行 A 可能匹配多個 B 名字INSTR + 連接SELECT DISTINCT a.no, a.name
FROM A a, B b
WHERE INSTR(a.name, b.name) > 0
AND b.sex = 1;
INSTR(str, sub) 參數順序與 CHARINDEX 相反,返回位置(1-based)INSTR('Hello World', 'or') = 8A_Name (a_id, name)CHARINDEX/INSTR 導致掃描,無法使用索引。百萬級資料需全文索引或拆表'li' 會誤匹配 'liu'。改用 ',' + name + ',' LIKE '%,' + b.name + ',%'(仍無索引)| 資料量 | 方案 |
|---|---|
| < 1 萬 | CHARINDEX/INSTR 直連可接受 |
| 1 萬 – 100 萬 | 正規化拆表 + 索引 + 內連接 |
| > 100 萬 | 全文檢索 / Elasticsearch / 正規化 + 分區 |