使用COALESCE的LIKE运算符中的特殊字符无效

时间:2015-12-15 13:04:43

标签: sql sql-server-2008 stored-procedures sql-like coalesce

我有一个文章表,如下所示:

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)+'%';

以下是问题: 当我使用sp执行此aid = 1时,会以aid 2和3执行该记录。 但是当我使用aid = 4执行时,没有任何结果可以归结为那些square brackets [Little]

这是存储过程执行脚本:

exec test @aID = 4;

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

4 个答案:

答案 0 :(得分: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 '\';

我已将[替换为\[,将]替换为\]并转义\,以便将方括号视为临时字符。

答案 1 :(得分:2)

如果您不希望like处理的标题中包含特殊字符,则可以使用charindex()

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

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

实际上,即使使用@atit is null or,只使用明确的NULL即可解决您的问题。

答案 2 :(得分: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)

答案 3 :(得分:0)

如果您不想使用任何功能,可以直接查看is null 检查下面的SQL。 select * from article where (@aID is null or artID = @aID) and (@atit is null or arttitle like '%'+ (@atit) +'%')