【问题标题】:How to handle special characters in SQL Server Select query如何处理 SQL Server Select 查询中的特殊字符
【发布时间】:2018-01-12 15:07:51
【问题描述】:

我在表中有以下数据

create table Manager(id int, managerid varchar(10) , managername varchar(50))

insert into Manager(id, managerid, managername)
values (1, 'A1', 'Mangesh'), (2, 'A''2', 'Sagar'), (3, '_C[%]3', 'Ah_mad'),
       (4, 'A4', 'Mango'), (5, 'B5', 'Sandesh')

我正在使用存储过程根据给定的字符获取结果。其中一位用户想要使用c[%] 进行搜索。我可以用[%] 处理%,但如果字符串有[%],那么我找不到它。

我尝试了以下查询

declare @str varchar(100)='C[[%]'

SELECT m.* 
FROM Manager m 
WHERE m.managerid LIKE '%'+@str+'%'

这样我就能得到结果,但在这种情况下,输入只是C[%。我在存储过程参数中将% 替换为[%]。但如果输入是C[%],那么我的查询不会返回任何内容。

【问题讨论】:

  • 问题不清楚。您是否正在寻找包含 c[%] 的 managerid?你试过 charindex 吗?
  • “我无法做到这一点” 不是问题描述。你尝试了什么?发生了什么?为什么错了?
  • 请包含您用于搜索c[%] 的代码。我怀疑你需要寻找 LIKE... ESCAPE 功能虽然

标签: sql sql-server


【解决方案1】:

您必须使用[] 转义方括号和% 字符,这告诉SQL 将它们视为文字。

所以为了找到%,它需要转义为[%],方括号也需要转义为[[]

您不需要转义],因为如果它不与[ 配对,则没有特殊含义。

select * from Manager where managerid like '%c[[][%]]%'

【讨论】:

    【解决方案2】:

    %_[ 都是特殊字符,应该转义。因此,即使您的 INSERT 语句也可能是错误的。

    您可以将特殊字符放在方括号 [] 之间以使其成为文字。

    insert into Manager(id,managerid,managername)values(3,'[_]C[[][%]]3','Ah[_]mad')
    

    您可以使用相同的方法搜索:

    SELECT * FROM Manager
    WHERE managerid LIKE '%C[[][%]]%'
    

    或者像这样定义你自己的转义字符:

    SELECT * FROM Manager
    WHERE managerid LIKE '%C\[\%]%' ESCAPE '\'
    

    以下是一些可能对您有用的文档:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql

    【讨论】:

      【解决方案3】:

      使用Escape 忽略wildcards。试试这个

      select * from Manager 
      where managerid like '%c\[%]%' escape '\'
      

      【讨论】:

        【解决方案4】:

        你只需要转义一个开头的'['

        SELECT * FROM MANAGER where managerid like '%_C[[%]%'
        

        【讨论】:

          【解决方案5】:

          如果您尝试使用输入 'C[%]' 进行搜索。检查这个答案,

          declare @str varchar(100)='C[%]'
          
          SELECT m.* 
          FROM Manager m 
          WHERE REPLACE(m.managerid,'[','')    LIKE  '%'+@str+'%'
          

          【讨论】:

            【解决方案6】:

            我找到了解决方案。

            declare @str varchar(100)='C\[\%]'
            
            SELECT m.* 
            FROM Manager m 
            WHERE m.managerid LIKE '%'+@str+'%' ESCAPE '\'
            

            成功了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-12-15
              • 2015-07-19
              • 2021-12-26
              • 2018-09-24
              • 1970-01-01
              • 2014-09-14
              相关资源
              最近更新 更多