在我使用LIKE运算符的可选参数查询中,Escape特殊字符不起作用.这是查询的一部分
NAME LIKE CASE WHEN '%'+@Name+'%' IS NULL THEN NAME ELSE '%'+@Name+'%' END
Run Code Online (Sandbox Code Playgroud)
我以为我可以做到这一点
NAME LIKE CASE WHEN '%'+@Name+'%'ESCAPE '\' IS NULL THEN NAME ELSE '%'+@Name+'%' END
Run Code Online (Sandbox Code Playgroud)
但是当我添加转义'\'但它引发了一个错误.任何帮助?
演示代码:
set @Name='Restaur\[ant'
SELECT [JOB].HOUSE_CODE, [JOB].JOB_CODE, [JOB].OPEN_DATE, [JOB].NAME AS Position, [JOB].DESCRIPTION, [RESTAURANT].ZIP_CODE AS ZipCode,
[STATE].STATE_NAME AS State, [RESTAURANT].CITY_NAME AS City
FROM [JOB] INNER JOIN
[RESTAURANT] ON [JOB].HOUSE_CODE = [RESTAURANT].HOUSE_CODE INNER JOIN
[STATE] ON [RESTAURANT].STATE_CODE = [STATE].STATE_CODE INNER JOIN
[JOB_CODE] ON [JOB].HOUSE_CODE = [JOB_CODE].HOUSE_CODE AND [JOB].JOB_CODE = [JOB_CODE].JOB_CODE AND
[RESTAURANT].HOUSE_CODE = [JOB_CODE].HOUSE_CODE
WHERE ( [JOB].NAME LIKE CASE WHEN '%'+@Name+'%' IS NULL THEN [JOB].NAME ELSE '%'+@Name+'%' END ESCAPE '\' )
Run Code Online (Sandbox Code Playgroud)
将ESCAPE放在CASE语句之外.此外,仅测试@Name为NULL就足够了.
NAME LIKE CASE WHEN @Name IS NULL THEN NAME ELSE '%'+@Name+'%' END ESCAPE `\`
Run Code Online (Sandbox Code Playgroud)
编辑:这里有一些演示代码来说明这种技术.
declare @test table (
name varchar(100)
)
insert into @test
(name)
select 'I am 100% confident this works.' union all
select 'There can be no doubt.' union all
select 'I would like to eat in fine restaur[ant some day.'
declare @name varchar(100)
/* Case when @name is NULL */
select name
from @test
where name like case when @name is null then name else '%'+@name+'%' end escape '\'
set @name = '100\%'
/* Case when @name has a value with a % */
select name
from @test
where name like case when @name is null then name else '%'+@name+'%' end escape '\'
set @name = 'restaur\[ant'
/* Case when @name has a value with a [ */
select name
from @test
where name like case when @name is null then name else '%'+@name+'%' end escape '\'
Run Code Online (Sandbox Code Playgroud)