面對「參數為空則查全部,非空則依條件過濾」的需求,習慣寫法是 IF 判斷拼接兩條 SQL。逆向思維利用邏輯運算子,單一語句即可涵蓋兩種情況。
IF @classStr = ''
SELECT * FROM Student;
ELSE
SELECT * FROM Student WHERE Class = @classStr;
SELECT * FROM Student
WHERE '' = @classStr OR @classStr = Class;
@classStr = '' 時:'' = '' 為真,WHERE TRUE OR ... 整體為真,回傳所有列。@classStr = 'A' 時:'' = 'A' 為假,轉而評估 'A' = Class,等同 WHERE Class = 'A'。SELECT * FROM Student
WHERE ('' = @classStr OR @classStr = Class)
AND ('' = @nameStr OR @nameStr = UserName)
AND (0 = @age OR @age = Age);
OPTION (RECOMPILE) 強制依實際參數值編譯。sp_executesql) 仍是效能最穩健的方案,但維護成本較高。NULL 或空字串的情況。