LIKE 查詢中的 ESCAPE 語句

如果你將文字搜尋實現為 LIKE-query,你通常會這樣做:

SELECT * 
FROM T_Whatever 
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%') 

但是,(除了你可以在使用全文搜尋時不必使用 LIKE 的事實),當有人輸入“50%”或“a_b”這樣的文字時,這會產生問題。

所以(而不是切換到全文搜尋),你可以使用 LIKE-escape 語句解決該問題:

SELECT * 
FROM T_Whatever 
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%') ESCAPE '\'

這意味著\現在將被視為 ESCAPE 角色。這意味著,你現在可以將\新增到你搜尋的字串中的每個字元,結果將開始正確,即使使用者輸入了像%_ 這樣的特殊字元。

例如

string stringToSearch = "abc_def 50%";
string newString = "";
foreach(char c in stringToSearch) 
     newString += @"\" + c;
 
sqlCmd.Parameters.Add("@in_SearchText", newString); 
// instead of sqlCmd.Parameters.Add("@in_SearchText", stringToSearch);

注意:上述演算法僅用於演示目的。如果 1 個字素由多個字元組成(utf-8),則不起作用。例如 string stringToSearch = "Les Mise\u0301rables"; 你需要為每個字素執行此操作,而不是為每個字元執行此操作。如果你正在處理亞洲/東亞/南亞語言,則不應使用上述演算法。或者更確切地說,如果你想要開始使用正確的程式碼,那麼你應該為每個 graphemeCluster 執行此操作。

另請參閱 ReverseString,一個 C#面試問題