清理3个嵌套的SQL`IF..ELSE`,以检查值是否为NULL,以在`WHERE ... AND`中使用

时间:2019-01-10 05:46:42

标签: 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
      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
...

更具可读性,但速度慢得多。有没有更清洁的方法可以做到这一点?

IF仅影响WITH部分,但我不能将IF放在WITH内。此外,如果不是NULL,则字段的唯一用法是通过  WHERE col1 = @value1等'

是否有一种更清洁的方法?这是所有值都存在时使用的WITH的示例:

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>

谢谢

2 个答案:

答案 0 :(得分:1)

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子句。我会以最佳方式进行更多挖掘。但是最简单的就是这个

答案 1 :(得分:0)

这是我发现的清除代码的方法。

我们写了一个通用的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