内联如果SQL中的语句

时间:2010-07-12 17:40:20

标签: sql tsql inline if-statement

我希望做这样的事情:

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

3 个答案:

答案 0 :(得分:4)

你可以这样做:

SELECT Col1, Col2
FROM tblSimpleTable
WHERE ( @IgnoreNulls != 1 OR Col2 IS NOT NULL )
ORDER BY Col1 DESC

答案 1 :(得分:3)

基于给定参数动态更改搜索是一个复杂的主题,并且以一种方式对其进行操作,即使只有非常小的差异,也会产生巨大的性能影响。关键是使用索引,忽略紧凑代码,忽略担心重复代码,必须做出好的查询执行计划(使用索引)。

阅读本文并考虑所有方法。您最好的方法取决于您的参数,数据,架构和实际使用情况:

Dynamic Search Conditions in T-SQL by by Erland Sommarskog

答案 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

这不太可能导致缓存次优查询计划的问题。