如果@param的值为null,则最好使用:
WHERE t.column = COALESCE(@param, '')
WHERE t.column = IFNULL(@param, '')
WHERE (@param IS NULL OR t.column = @param)
OR比将列与将返回指定列的所有值的值相比更昂贵吗?我的理解是选项1& 2将强制每次都进行全表扫描,而#3则不会。
答案 0 :(得分:0)
我建议您在查询前使用EXPLAIN
来尝试这三个选项,并查看MySQL认为与您的表和索引相关的内容。
答案 1 :(得分:0)
选项2看起来像语法错误; ISNULL只接受一个参数,并返回一个布尔值。
选项1和3可以返回不同的值。当@param为null时,选项1将仅返回t.column为空字符串的行,其中选项3将返回所有行。除非你在t.column上有一个索引,否则任何一个都会使用全表扫描;即便如此,当@param为空时,选项3将使用完整扫描。
答案 2 :(得分:0)
3是最好的,因为优化器会在优化器阶段将该评估短路并消除where子句。