我希望做这样的事情:
DECLARE @IgnoreNulls = 1;
SELECT Col1, Col2
FROM tblSimpleTable
IF @IgnoreNulls
BEGIN
WHERE Col2 IS NOT NULL
END
ORDER BY Col1 DESC;
这个想法是以PHP / ASP.NET-ish的方式,只在用户希望的情况下过滤NULL。这在T-SQL中是否可行?或者我们需要一个像这样的大型IF块:
IF @IgnoreNulls
BEGIN
SELECT Col1, Col2
FROM tblSimpleTable
WHERE Col2 IS NOT NULL
ORDER BY Col1 DESC;
END
ELSE
BEGIN
SELECT Col1, Col2
FROM tblSimpleTable
ORDER BY Col1 DESC;
END
答案 0 :(得分:4)
你可以这样做:
SELECT Col1, Col2
FROM tblSimpleTable
WHERE ( @IgnoreNulls != 1 OR Col2 IS NOT NULL )
ORDER BY Col1 DESC
答案 1 :(得分:3)
基于给定参数动态更改搜索是一个复杂的主题,并且以一种方式对其进行操作,即使只有非常小的差异,也会产生巨大的性能影响。关键是使用索引,忽略紧凑代码,忽略担心重复代码,必须做出好的查询执行计划(使用索引)。
阅读本文并考虑所有方法。您最好的方法取决于您的参数,数据,架构和实际使用情况:
答案 2 :(得分:1)
一般情况下(除非表格很小),最好的方法是将案例分开,并在你的问题中做一些类似的事情。
IF (@IgnoreNulls = 1)
BEGIN
SELECT Col1, Col2
FROM tblSimpleTable
WHERE Col2 IS NOT NULL
ORDER BY Col1 DESC;
END
ELSE
BEGIN
SELECT Col1, Col2
FROM tblSimpleTable
ORDER BY Col1 DESC;
END
这不太可能导致缓存次优查询计划的问题。