If statement 清理3个嵌套SQL`IF..ELSE`检查值是否为NULL,用于`WHERE…AND`

If statement 清理3个嵌套SQL`IF..ELSE`检查值是否为NULL,用于`WHERE…AND`,if-statement,with-statement,sql-server-2017,If Statement,With Statement,Sql Server 2017,我有一个列数大于50的表。我正在编写一个存储过程,其中用户希望在其他参数中传入3个可选参数来过滤数据集。通常我的代码看起来像 IF @value1 IS NULL IF @value2 IS NULL IF @value3 IS NULL WITH...SELECT ELSE WITH...SELECT ELSE IF @value3 IS NULL WITH...SELECT EL

我有一个列数大于50的表。我正在编写一个存储过程,其中用户希望在其他参数中传入3个可选参数来过滤数据集。通常我的代码看起来像

IF @value1 IS NULL
   IF @value2 IS NULL
      IF @value3 IS NULL
         WITH...SELECT
      ELSE
         WITH...SELECT
   ELSE
      IF @value3 IS NULL
         WITH...SELECT
      ELSE
         WITH...SELECT
ELSE
   IF @value2 IS NULL
      IF @value3 IS NULL
         WITH...SELECT
      ELSE
         WITH...SELECT
   ELSE
      IF @value3 IS NULL
         WITH...SELECT
      ELSE
         WITH...SELECT
但这似乎很混乱,而且很复杂,特别是因为WITH相对较大

或者

IF @value1 IS NULL AND
   @value2 IS NULL AND
   @value3 IS NULL
   WITH..SELECT
ELIF @value1 IS NULL AND
   @value2 IS NULL AND
   WITH..SELECT
ELIF ...
   WITH..SELECT
ELIF ...
   WITH..SELECT
...
更具可读性,但速度要慢得多。有没有更干净的方法

IFs只影响WITH部分,但我不能在WITH中添加IF。此外,字段(如果不为NULL)的唯一用法是通过 其中col1=@value1等'

有没有更干净的方法?以下是当所有值都存在时使用的示例:

WITH trans AS
(
    SELECT *
      FROM myTable
     WHERE myKey = '12345'
       AND col1  = @value1
       AND col2  = @value2
       AND col3  = @value3
)
SELECT *
  FROM trans
 WHERE <additional criteria not dependent on @values>

感谢where子句中的用例。一个案例有多个,然后就可以了。 另一种粗糙的方法可能是这样的:

  DECLARE  @value1 as nvarchar(max),
         @value2 as nvarchar(max),
         @value3 as nvarchar(max)

declare @whereClause as nvarchar(max) = Select case when @value1 is null and @value2 IS NULl and @value3 is null then 'where clause 1'
                                                    when @value1 is null and @value2 IS NOT NULl and @value3 is NOT null then 'where clause 2'
                                                    else ''

使用where子句。我会挖更多的来寻找最好的方法。但最简单的方法是这样的

这是我发现的清理代码的方法

我们编写了一个通用WHERE子句,如下所示

 WHERE myKey = '12345'
   AND (@value1 IS NULL OR col1 = @value1)
   AND (@value2 IS NULL OR col2 = @value2)
   AND (@value3 IS NULL OR col3 = @value3)

然后就不需要嵌套IF了。

+1谢谢您的尝试。但在性能方面,这与我的案例2中的案例2有什么不同吗?案例2使用IF..ELIF..ELSE进行这种构造?似乎条件将按顺序计算,因此@value1 IS NULL可能会计算8次?嵌套IFs系统似乎更好,没有什么比一次评估更有效。我希望有一个更好的解决方案,例如,允许创建这些WHERE..AND子句,我正在以更好的方式使用这些值