2015-12-15 66 views
0

我有一个文章表,如下图所示:特殊字符不工作

create table article(
    artID int, 
    arttitle varchar(50) 
) 

我在下面插入4个记录:

insert into article values (1,'abcd'); 
insert into article values (2,'asfsdf asdf sdf '); 
insert into article values (3,'asdfasdfa sd '); 
insert into article values (4,'abcasdfsdd [Little]'); 

创建一个测试存储过程:

create procedure test 
@aID int = null, 
@atit varchar(50) = null 
as 
select * from article where artID = COALESCE(@aID,artID) and 
arttitle like '%'+COALESCE(@atit,arttitle)+'%'; 

这里的问题是: 当我执行此spaid = 1它与该记录的结果和类似的aid 2和3. 但是,当我与aid = 4执行时没有结果是由于那些square brackets [Little]

这里是存储过程的执行脚本:

exec test @aID = 4; 

请帮我实现这一目标。谢谢! 这里是sqlfiddle link

回答

0

如果你不希望使用任何功能,你可以直接检查is null 检查波纹管SQL。 select * from article where (@aID is null or artID = @aID) and (@atit is null or arttitle like '%'+ (@atit) +'%')

+1

这对我很有用,因此将其标记为答案。但我想知道为什么特殊字符没有被COALESCE处理。 –

+0

它不是'coalesce',它是''''操作符。 –

+0

@Evaldas:是的,如果我们想在类似的查询中使用'COALESCE',我们需要使用'ESCAPE'\''。 但是,至于问题,我认为只是为了检查'是否为空'就足以解决错误。 –

3

这是因为这两个[]是特殊字符,意味着符号,这是在括号中的一个必须匹配。为了解决它 - 你可以逃避这些。

这是你可以做什么:

DECLARE @article TABLE 
(
    artID INT 
    , arttitle VARCHAR(50) 
); 

INSERT INTO @article 
VALUES (1, 'abcd') 
    , (2, 'asfsdf asdf sdf ') 
    , (3, 'asdfasdfa sd ') 
    , (4, 'abcasdfsdd [Little]'); 

DECLARE @aID INT = 4 
    , @atit VARCHAR(50) = NULL 

SELECT * 
FROM @article 
WHERE artID = COALESCE(@aID, artID) 
    AND arttitle LIKE '%' + COALESCE(@atit, REPLACE(REPLACE(arttitle, '[', '\['), ']', '\]')) + '%' ESCAPE '\'; 

我把它换成[\[]\]和逃脱\,使方括号作为休闲字符处理。

+0

这是一个非常大的存储过程和表的一部分,用户可以输入任何方括号,大括号,任何特殊字符。所以包括您的更改将满足所有条件?或者我还得做别的事情? –

+1

你应该在你的问题中提到过这个。在这种情况下,这种解决方案非常笨拙。我想说的是由Gordon Linoff提供的解决方案。那么你不必逃避特殊的字符。 –

2

如果你有,你不想被like处理的标题特殊字符,你可以只使用charindex()

where @atit is null or charindex(@atit, artitle) > 0 

如果你想使用通配符,那么like是一个更好的选择。但这似乎不是你的意图。

其实,只要使用明确的@atit is null or即使使用NULL也能解决您的问题。

+0

所以即使我们使用@atit执行过程,这也可以工作吗?我的意思是exec test @ atit ='abcd'会起作用吗? –

0
create table article(
artID int, 
arttitle varchar(50) 
) 

insert into article values (1,'abcd'); 
insert into article values (2,'asfsdf asdf sdf '); 
insert into article values (3,'asdfasdfa sd '); 
insert into article values (4,'abcasdfsdd [Little]'); 

create procedure test 
declare 
as 
@aID int =4, 
@atit varchar(50) = null 

select * from article where artID = COALESCE(@aID,artID) and (@atit is null or charindex(@atit, arttitle) > 0)