如何在SQL Query中使用LIKE转义

时间:2015-05-29 15:54:15

标签: sql tsql

我的查询是:

declare @param1 INT,
@param2 nvarchar(max)

set @param1 = 1
set @param2 = '[Test_data_forQry],[Next_Test_Data]'

SELECT * 
FROM Table1
WHERE
    ColumnA = @param1  
AND (',' + @param2 +',' LIKE '%,' + CONVERT(VARCHAR, ColumnB) + ',%');

方括号和下划线阻止了数据提取。我的问题是我应该在最后一行查询中放置 escape'\'。 我还尝试了 REPLACE 选项,但没有效果

set @param1 = 1
set @param2 = '[Test_data_forQry],[Next_Test_Data]'

set @param2  = replace (replace(@param2  , '[', '[[]'), '_','[_]') 

SELECT * 
FROM Table1
WHERE
    ColumnA = @param1  
AND (',' + @param2 +',' LIKE '%,' + CONVERT(VARCHAR, ColumnB) + ',%');

3 个答案:

答案 0 :(得分:0)

您需要先转义所有LIKE字符并使用ESCAPE运算符。此外,您将ColumnB转换为VARCHAR默认情况下仅为VARCHAR(30),因此ColumnB中的数据被截断且不匹配,因为@ param2本身是未转义的35个字符。

见下文:

DECLARE @param1 INT, @param2 NVARCHAR(MAX);

SET @param1 = 1
SET @param2 = '[Test_data_forQry],[Next_Test_Data]'

-- Replace LIKE special characters
SET @param2 = REPLACE(REPLACE(REPLACE(REPLACE(@param2, '[', '|['), ']', '|]'), '%', '|%'), '_', '|_')

SELECT *
FROM Table1
WHERE
    ColumnA = @param1  
    AND CONVERT(NVARCHAR(MAX), ColumnB) LIKE ('%,' + @param2 +',%') ESCAPE '|';

修改:如果您的ColumnB数据确实包含' [Test_data_forQry]'你在其中一条评论中指出的,然后让它像这样转换并转义ColumnB而不是@param2:

DECLARE @param1 INT, @param2 NVARCHAR(MAX);

SET @param1 = 1
SET @param2 = '[Test_data_forQry],[Next_Test_Data]'

SELECT *
FROM Table1
WHERE
    ColumnA = @param1  
    AND @param2 LIKE '%' + REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(MAX), ColumnB), '[', '|['), ']', '|]'), '%', '|%'), '_', '|_') + '%' ESCAPE '|';

在地方发生这么多事情的情况下效果不佳,但这会匹配ColumnA = 1和ColumnB =' [Test_data_forQry]'

的行。

<强>更新 更新为在逗号上拆分搜索字符串(可能需要先从here创建一个函数):

DECLARE @param1 INT, @param2 NVARCHAR(MAX);

SET @param1 = 1
SET @param2 = '[Test_data_forQry],[Next_Test_Data]'

-- Replace LIKE special characters
SET @param2 = REPLACE(REPLACE(REPLACE(REPLACE(@param2, '[', '|['), ']', '|]'), '%', '|%'), '_', '|_')

SELECT DISTINCT t.*
FROM Table1 t
    INNER JOIN dbo.split(@param2, ',') split ON 1=1
WHERE
    t.ColumnA = @param1  
    AND CONVERT(NVARCHAR(MAX), t.ColumnB) LIKE ('%' + split.s + '%') ESCAPE '|';

答案 1 :(得分:0)

我能够通过使左方括号成为文字来实现。试试这个:

declare @table table (column1 varchar(100))
insert @table(column1) values('[square_brackets_1]')
insert @table(column1) values('[square_brackets_2]')
insert @table(column1) values('[square_brackets_3]')
insert @table(column1) values('[square_brackets_4]')
insert @table(column1) values('[square_brackets_5]')

select * from @table

select * from @table where column1 like '[[]square_brackets_5]'

参考:https://msdn.microsoft.com/en-us/library/ms179859.aspx

答案 2 :(得分:0)

我建议你像这样使用"

set @param2 = '"' + REPLACE(@param2, ',' , '","') + '"'
  

注意:
  SET QUOTED_IDENTIFIER = ON =&gt;默认
  当SET QUOTED_IDENTIFIERON时,标识符可以用双引号分隔,文字必须用单引号分隔。如果SET QUOTED_IDENTIFIEROFF,则无法引用标识符,并且必须遵循标识符的所有Transact-SQL规则。