2010-11-03 63 views
1

在我使用LIKE运算符的可选参数查询中,Escape特殊字符不起作用。 这是查询Escape不能使用可选参数!

NAME LIKE CASE WHEN '%'[email protected]+'%' IS NULL THEN NAME ELSE '%'[email protected]+'%' END 

的一部分,我想我可以把它像

NAME LIKE CASE WHEN '%'[email protected]+'%'ESCAPE '\' IS NULL THEN NAME ELSE '%'[email protected]+'%' END 

但是当我添加逃逸“\”,但它引发错误。 任何帮助?

演示代码:

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 '%'[email protected]+'%' IS NULL THEN [JOB].NAME ELSE '%'[email protected]+'%' END ESCAPE '\') 
+2

也许你只是写你想要实现的?很难回答一些不是问题的东西。 – AlexanderMP 2010-11-03 14:30:23

+0

为演示提供足够的代码详细信息 – mahesh 2010-11-03 14:34:17

+0

它引发了什么错误? – 2010-11-03 14:37:11

回答

0

你在寻找它呢?我想你的第一个例子,它的表现我希望它的方式:如果我提供一个价值@Name它只是如果我离开它,它会返回所有名称返回一个包含该值名称,

CREATE TABLE test2 (
NAME varchar(100) 
) 

GO 

INSERT test2(name) values('Fred') 
INSERT test2(name) values('bert') 

GO 
DECLARE @name VARCHAR(100) 
--SET @name='re' 
SELECT * FROM test2 
WHERE NAME LIKE CASE WHEN '%'[email protected]+'%' IS NULL THEN NAME ELSE '%'[email protected]+'%' END 

0

你真的想比较'%'+ @名称+'%ESCAPE'\'为空吗?我想你想要把逃生关键字以后,像这样:

CASE WHEN '%'[email protected]+'%' IS NULL THEN NAME ELSE '%'[email protected]+'%' ESCAPE '\' END 
+0

我试过这种方式,也没有工作。 – 2010-11-03 14:40:55

+0

问题是,如果没有Escape,它不会读取并且包含包含[的单元格的行。所以即时尝试使用ESCAPe来避免这种情况。 – 2010-11-03 14:46:05

1

你试图把一个空间ESCAPE过吗?

+'%'ESCAPE '\' IS 

这样:

+'%' ESCAPE '\' IS 
+0

我把空间,它不起作用。 – 2010-11-03 14:41:29

+0

它抛出了什么错误? – 2010-11-03 14:42:24

5

把ESCAPE CASE语句之外。此外,仅为NULL测试@Name就足够了。

NAME LIKE CASE WHEN @Name IS NULL THEN NAME ELSE '%'[email protected]+'%' END ESCAPE `\` 

编辑:下面是一些演示代码来说明该技术。

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 '%'[email protected]+'%' 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 '%'[email protected]+'%' 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 '%'[email protected]+'%' end escape '\' 
+0

不能以这种方式工作。 – 2010-11-03 14:44:59

+0

@Ali Nour:我在我的答案中添加了一些演示代码来说明该技术的工作原理。 – 2010-11-03 14:49:19

+0

谢谢你,但它仍然不工作[,我插入Restaur [蚂蚁它不读取行。 – 2010-11-03 15:01:08