如何转义字符串以与 SQL Server 中的 LIKE 运算符一起使用?
-
07-07-2019 - |
题
我正在寻找在 SQL Server 中工作的类似于 @
C# 中的符号会导致字符串被视为文字。例如:
string text = "abcd\\efg";
Output of text = abcd\efg
string text = @"abcd\\efg";
Output of text = abcd\\efg
请注意 @ 如何影响字符串以按原样获取每个字符。
现在我不确定这是否可能,但这是我的问题,也许有更好的方法来解决这个问题。考虑以下基本查询:
SELECT [Name]
FROM [Test]
WHERE [Name] LIKE (@searchText + '%')
我的问题是如果他们放了一个 %
, _
或任何其他可能影响我的 like 子句的特殊字符。我希望匹配的行为就像“开头为”功能一样。那么,有什么我可以应用于@searchText来表示从字面上理解,或者是否有一个我没有想到的更好的解决方案?
编辑: 我不希望解决方案是客户端清理。我需要这个存储过程来工作,而不依赖于清理中传递的数据。
解决方案
要在字符串中搜索“%”作为文字而不是通配符,需要将其转义为 [%]。
现在,SQL Server 只需要 3 个字符转义:%_[
因此,创建一个标量 udf 来包装它:
REPLACE(REPLACE(REPLACE(@myString, '[', '[[]'), '_', '[_]'), '%', '[%]')
因为简单(又名:非常有限)SQL 中的模式匹配,不需要更复杂的东西......
其他提示
在TSQL中,你可以将%和_字符包装在括号中,如[%] [_]这告诉SQL将它们视为文字。
我已在SQL Server 7.0,2000和2005中测试并验证了此功能。
字面上要对待的每个字符都应该用方括号括起来。右括号直接采用直接拍摄,因此不要将其括起来。
如果您参数化查询,则无需担心。
<强>更新强>
正如评论中所说的递归,即使在参数化查询中仍然需要转义%,我没有意识到linq to sql在我测试时是自动执行的。
您可以使用ESCAPE'x',其中x是您希望成为转义字符的字符。 Linq to SQL就像这样
WHERE [Name] LIKE @searchText ESCAPE'〜'
其中@searchText = [某些带有〜%字符%的文字]
或正如其他人所说,可以使用[%]
进行转义我会清理前端应用程序中的字符串,而不是尝试在SQL中使用hokey来解决这个问题。
来自文档:
<强>语法强>
match_expression [NOT] LIKE pattern [ESCAPE escape_character ]
使用 ESCAPE
选项,如下所示:
SELECT [Name]
FROM [Test]
WHERE [Name] LIKE (REPLACE(@searchText, '%', '%%') + '%') ESCAPE '%'
如果您不想修改传入文本,可以使用“LEFT”键。用于创建自己的“STARTSWITH”:
SELECT [Name]
FROM [Test]
WHERE @searchText = LEFT( [Name], LEN( @searchText ) )
(注意,您可能需要做额外的工作来处理NULL或空字符串的情况。)
编辑:删除了关于使用“LIKE”的错误陈述搜索“%”。