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#面试问题