2

以下作品

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条款吗?

4

4 回答 4

3

可以再简化一点:

  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
于 2013-04-11T21:01:25.437 回答
2

处理此问题的最佳方法是将 转换if为单个条件。我相信这将提供相同的结果:

   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
于 2013-04-11T18:42:13.453 回答
1
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'))

OR
(
c.Name NOT IN ('X','Y')
AND @Period NOT IN ('Overall','Week1','Week2','Week3','Week4')
)
GROUP BY UserAccountKey
于 2013-04-11T18:43:19.557 回答
0
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
于 2013-04-11T18:41:06.973 回答