Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将IF转换为WHERE子句_Sql_Sql Server - Fatal编程技术网

Sql 将IF转换为WHERE子句

Sql 将IF转换为WHERE子句,sql,sql-server,Sql,Sql Server,以下作品 IF OBJECT_ID('TEMPDB..#Users') IS NOT NULL BEGIN DROP TABLE #Users END; CREATE TABLE #Users(UserAccountKey INT); IF @Period IN ('Overall', 'Week1', 'Week2', 'Week3', 'Week4') BEGIN INSERT INTO #Users SELECT UserAccountKey

以下作品

IF OBJECT_ID('TEMPDB..#Users') IS NOT NULL 
BEGIN 
    DROP TABLE #Users 
END;

CREATE TABLE #Users(UserAccountKey INT);

IF @Period IN ('Overall', 'Week1', 'Week2', 'Week3', 'Week4') 
BEGIN
   INSERT INTO #Users
      SELECT UserAccountKey
      FROM XXX c
      WHERE c.Name NOT IN ('X', 'Y', 'Z', 'J', 'Q')
      GROUP BY UserAccountKey
END
ELSE
BEGIN
   INSERT INTO #Users
      SELECT UserAccountKey
      FROM XXX c
      WHERE c.Name NOT IN ('X', 'Y')
      GROUP BY UserAccountKey;
END;

是否可以将其缩短为一条sql语句?
IF
条件能否转移到
WHERE
子句中?

处理此问题的最佳方法是将
IF
转换为单个条件。我相信这会带来同样的结果:

INSERT INTO #Users
SELECT userAccountKey
FROM XXX c
WHERE c.Name NOT IN ('X','Y','Z','J','Q')
AND @Period IN ('Overall','Week1','Week2','Week3','Week4')
GROUP BY UserAccountKey

INSERT INTO #Users
SELECT UserAccountKey
FROM xxx C
WHERE c.Name NOT IN ('X','Y')
AND @Period NOT IN ('Overall','Week1','Week2','Week3','Week4')
GROUP BY UserAccountKey
   INSERT INTO #Users
      SELECT UserAccountKey
      FROM XXX c
      WHERE (@Period NOT IN ('Overall', 'Week1', 'Week2', 'Week3', 'Week4')
             and c.Name NOT IN ('X', 'Y'))
         or (@Period IN ('Overall', 'Week1', 'Week2', 'Week3', 'Week4')
            and c.Name NOT IN ('X', 'Y', 'Z', 'J', 'Q'))
      GROUP BY UserAccountKey

这一直困扰着我,因为我认为它应该可以简化,但我不知道如何简化。我最初的答案与@Pirion的答案相同,但我改变了它,因为我意识到它与最初的脚本不同。下面是一个简化的脚本,我认为它提供了与我前面的答案相同的功能:

   INSERT INTO #Users
      SELECT UserAccountKey
      FROM XXX c
      WHERE not (c.Name IN ('X', 'Y')
                 or (@Period IN ('Overall', 'Week1', 'Week2', 'Week3', 'Week4')
                     and c.Name IN ('Z', 'J', 'Q'))
      GROUP BY UserAccountKey

可以简化一小段时间:

  INSERT INTO #Users
  SELECT UserAccountKey
  FROM XXX c
  WHERE c.Name NOT IN ('X', 'Y')
        OR (@Period IN ('Overall', 'Week1', 'Week2', 'Week3', 'Week4')
             AND c.Name NOT IN ('Z', 'J', 'Q'))
  GROUP BY UserAccountKey

@marc_的欢呼声更整洁了……有点误解:我想把它缩小到一个语句中……看看其他可能的答案,你需要使用或代替first AND。肯定更短,但@Allan solution更可读——至少对我来说——我的布尔逻辑并不总是那么清晰。如果
name
上的运算符是
中的
。但是,由于它不在
中使用
,因此结果将不同于原始查询。例如,假设
Name='Z'
@Period='Other'
。这种情况将满足
的前半部分,因此将插入该行。如果period=Other,那么它将下拉到ELSE子句,name=Z不在X或Y中,因此它将插入原始查询。对不起,我不同意你的看法。我用过这个版本@皮里翁的版本更聪明,但如果我以后不得不重温剧本的话,这个版本将减少我的思考
  INSERT INTO #Users
  SELECT UserAccountKey
  FROM XXX c
  WHERE c.Name NOT IN ('X', 'Y')
        OR (@Period IN ('Overall', 'Week1', 'Week2', 'Week3', 'Week4')
             AND c.Name NOT IN ('Z', 'J', 'Q'))
  GROUP BY UserAccountKey