我有一个文章表,如下所示:
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
答案 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) +'%')