2013-02-19 40 views
2

作爲SQL Server搜索查詢中WHERE子句的條件之一,我試圖通過courseId使用ISNULL進行搜索。ISNULL通配符'%'搜索沒有返回記錄

使用除@currentUserId以外的所有空值執行查詢時,查詢將不返回任何記錄。

我的SQL:

DECLARE @currentUserId int = '6' 
    DECLARE @searchString nvarchar(MAX) = NULL 
    DECLARE @courseId nchar(10) = NULL 
    DECLARE @dateFrom date = NULL 
    DECLARE @dateTo date = NULL 


    SELECT [questionId],[Question].[moduleId],[questionDate],[questionTopic] 
    FROM [dbo].[Question],[dbo].[Module],[dbo].[ModuleCourse] 
    WHERE [lecturerId] = @currentUserId AND 

    ([dbo].[Question].[moduleId] = [dbo].[Module].[moduleId] AND 
    [dbo].[Module].[moduleId] = [dbo].[ModuleCourse].[moduleId]) AND 

    ([dbo].[Question].[questionTopic] LIKE ISNULL('%' + @searchString + '%','%') OR 
    [dbo].[Question].[questionText] LIKE ISNULL('%' + @searchString + '%','%')) AND 

    [dbo].[ModuleCourse].[courseId] = ISNULL(@courseId,'%') AND 

    ([dbo].[Question].[questionDate] >= ISNULL(@dateFrom,(SELECT MIN([questionDate]) 
                   FROM [dbo].[Question])) AND 
    [dbo].[Question].[questionDate] <= ISNULL(@dateTo,(SELECT(GETDATE())))) 

當行

[dbo].[ModuleCourse].[courseId] = ISNULL(@courseId,'%') AND 

被註釋掉,返回結果符合市場預期。 ([dbo]。[ModuleCourse]。[courseId] is PK; nchar(10))

好像通配符%在這種情況下不起作用;我不知道爲什麼。 請幫忙...

回答

4

如果@courseId爲空,您將比較courseId與字符串'%'=運算符不使用通配符。

可以使用like代替=,或寫爲條件:

(@courseId is null or [dbo].[ModuleCourse].[courseId] = @courseId) AND 
+0

Guffa嗨,在LIKE仍然什麼也沒有返回,但條件子句預期返回正確的結果。許多的後裔;我認爲我從字面上丟失了頭髮...... – 2013-02-19 13:28:58

+1

@ user1748443:啊,你也有'nchar(10)'數據類型的問題,表達式'ISNULL(@courseId,'%')'不會返回當'@ courseId'爲空時''%''',它會返回填充長度爲10的空格。您可能需要使用'nvarchar(10)'。 – Guffa 2013-02-19 13:32:44

+0

謝謝;這是LIKE的問題.. – 2013-02-19 14:24:30