8

SQL Server 具有 LIKE 运算符来处理通配符搜索。我的客户希望在应用程序的用户界面中使用“*”(星号)字符作为通配符。我只是想知道在执行 LIKE 通配符搜索之前,除了“%”(百分比)字符本身之外,我是否需要担心任何标准字符(在 SQL Server 中用作特殊字符),以防它们的关键字包含“%”,需要在实际字符串中找到一个“%”。如果是这样,它们是什么?

所以请假设 [table1].[column1] 在文本字符串中永远不会有“*”(星号)!

这是我到目前为止所拥有的。"%"除了标准角色和习惯之外,我是否需要处理更多的情况?"*"

-- custom replacement
select REPLACE('xxx*xxx', '*', '%')

-- standard replacements
select REPLACE('xxx%xxx', '%', '[%]')
select REPLACE('xxx_xxx', '_', '[_]')  -- ???
select REPLACE('xxx[xxx', '[', '[[]')  -- ???
select REPLACE('xxx]xxx', ']', '[]]')  -- ???

例子:

SET @p = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@p, ']', '[]]'), '[', '[[]'), '_', '[_]'), '%', '[%]'), '*', '%')

SELECT 'xxxxxxxxx%xxxxxx' LIKE @p

SELECT [table1].[column1] LIKE @p
4

2 回答 2

10

看起来你已经掌握了所有这些,尽管我认为转义 ']' 是不必要的。从技术上讲,您应该只需要转义左括号('[')。

DECLARE @Table1 TABLE
(
   Column1 VARCHAR(32) NOT NULL PRIMARY KEY
);

INSERT @Table1(Column1)
VALUES
   ('abc%def'),
   ('abc_def'),
   ('abc[d]ef'),
   ('abc def'),
   ('abcdef');

DECLARE @p VARCHAR(32) = 'abc*]*';

DECLARE @Escaped VARCHAR(64) = REPLACE(@p, '[', '[[]');
SET @Escaped = REPLACE(@Escaped, '_', '[_]');
SET @Escaped = REPLACE(@Escaped, '%', '[%]');
SET @Escaped = REPLACE(@Escaped, '*', '%');

SELECT T.Column1
FROM @Table1 T
WHERE T.Column1 LIKE @Escaped;
于 2013-10-23T21:01:04.567 回答
2

看起来不错!!-在这里LIKE查看与该条款相关的所有信息。

SQL LIKE子句的特殊字符列表

于 2013-10-23T21:01:14.513 回答