2010-11-03 6 views
1

Dans ma requête de paramètre facultatif qui utilise l'opérateur LIKE, les caractères spéciaux Escape ne fonctionnent pas. cela fait partie de la requêteEscape ne fonctionne pas avec les paramètres optionnels!

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

je pensais que je peux le faire comme

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

mais quand j'ajouter échapper « \ », mais il provoque une erreur. toute aide ??

Code Demo:

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

Peut-être que vous écririez juste ce que vous essayez d'accomplir? Il est difficile de répondre à quelque chose qui n'est pas une question. – AlexanderMP

+0

Fournir suffisamment de détails sur le code pour démontrer – mahesh

+0

Quelle erreur lance-t-il? –

Répondre

0

Qu'est-ce que vous cherchez à faire? J'ai essayé votre premier exemple et il comportais la façon dont je me attends à:

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 

Si je fournir une valeur pour @Name il retourne uniquement les noms contenant cette valeur, si je le laisse sur elle retourne tous les noms?

0

Voulez-vous vraiment comparer '%' + @ Name + '% ESCAPE' \ 'à null? Je pense que vous voulez mettre le mot-clé d'échappement plus tard, comme suit:

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

J'ai essayé de cette façon et ne fonctionne pas non plus. –

+0

Le problème est que sans Escape, il ne lit pas et row qui contient des cellules qui contiennent [. donc j'essaie d'utiliser ESCAPe pour éviter cela. –

1

Avez-vous essayé de mettre un espace avant ESCAPE?

+'%'ESCAPE '\' IS 

à ceci:

+'%' ESCAPE '\' IS 
+0

je mets de la place et ça ne marche pas. –

+0

Quelle erreur lance-t-elle? –

5

Mettre le ESCAPE en dehors de l'instruction CASE. En outre, il suffit de tester @Name pour NULL.

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

EDIT: Voici un code de démonstration pour illustrer la technique.

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

n'a pas fonctionné de cette façon. –

+0

@Ali Nour: J'ai ajouté du code démo à ma réponse pour illustrer que la technique fonctionne. –

+0

Merci l'homme mais il ne fonctionne toujours pas sur [, j'insère Restaur [ant ans il ne lit pas la ligne. –

Questions connexes