資料表 Table_5 欄位 strNum 存放逗號分隔代碼 (如 ,aaa,bbb,),需查詢 **精確包含 `aaa`** 的列,**排除 `aaaa`** 等較長代碼。
WHERE strNum LIKE '%,aaa,%' -- 仍會匹配 ',aaaa,' (因為 aaaa 含 aaa)
若字串包含目標子字串,REPLACE 會將其移除,導致結果字串 **長度改變 / 內容不同**。利用此特性:
SELECT *
FROM [master].[dbo].[Table_5]
WHERE REPLACE(',' + strNum + ',', ',aaa,', '') <> ',' + strNum + ',';
,` 確保邊界完整 (避免 `aaa` 在開頭/結尾被遺漏)。REPLACE(full_str, ',aaa,', '') 若找到目標 → 移除 → 字串變短 → `<>` 原字串 → **符合條件**。REPLACE 為純量函數,**無法使用索引**,全表掃描。Table_Code (id, code),用 JOIN / EXISTS。ALTER TABLE ADD has_aaa AS CASE WHEN ... THEN 1 ELSE 0 END PERSISTED。-- 同時包含 aaa 與 bbb
WHERE REPLACE(REPLACE(','+strNum+',', ',aaa,', ''), ',bbb,', '') <> ','+strNum+',';
REPLACE 反向判斷是**不改變結構、快速原型**的實用技巧,但**不適合大量資料高頻查詢**。長期專案請採用正規化關聯設計或計算欄位索引。