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