【问题标题】:T-SQL special characters to escape for LIKE operator wildcard search为 LIKE 运算符通配符搜索转义的 T-SQL 特殊字符
【发布时间】:2013-11-02 07:57:32
【问题描述】:

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

【问题讨论】:

    标签: sql-server replace special-characters sql-like


    【解决方案1】:

    看起来不错!! - 查看here 以获取与LIKE 子句相关的所有信息。

    还有List of special characters for SQL LIKE clause

    【讨论】:

    • John - 这个问题列出了一个单引号,但我认为您不需要为带有单引号的 LIKE 子句做任何特别的事情。我认为当您在 SQL Server Management Studio 中键入单引号时,这具有不同的“特殊”含义上下文,您需要使用其中两个来表示一个。正确的?我真的在寻找“完美”的命令来满足我所描述的用例。
    • @MacGyver,我同意你的看法......我真的认为你已经掌握了所有这些! - 我会做一个快速测试,以确保你的 SQL 在你的查询字符串中使用' 运行,但我猜它会......
    • 酷。我从未使用过说明符或转义子句(来自您的链接)语法。如果(理论上)一个足够聪明的最终用户输入其中一个,你认为这仍然成立吗?我现在正在尝试测试这些......因为我只是逃避第一个和最后一个括号,中间的所有东西都将成为他们关键字的一部分。所以我只是在寻找你关于一个好的界面如何处理这些的建议。有什么想法吗?
    • 我认为,由于您只是创建 LIKE 语句,因此您不必担心 ESCAPE 子句,因为它不是 like 模式的一部分。
    • 真的,看来你的声明已经处理好了一切......除了测试',我认为你很高兴!!!
    【解决方案2】:

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

    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;
    

    【讨论】:

    • 为什么我不需要右括号?因为我们不希望 LIKE 运算符获取该字符并将其解释为说明符?
    • @MacGyver,请参考msdn.microsoft.com/en-us/library/ms179859(v=sql.105).aspx将通配符用作文字部分。您会看到 ']' 不需要转义。解析首先必须先查找左括号 ([),然后再查找后面的右括号 (])。
    • 感谢您指出我不需要 ](右括号)。我不管它,它工作得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多