2015-12-15 131 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)