Sql 第二个CASE语句如何影响性能
我想更好地了解以下查询中的幕后情况:Sql 第二个CASE语句如何影响性能,sql,sql-server,tsql,case,case-when,Sql,Sql Server,Tsql,Case,Case When,我想更好地了解以下查询中的幕后情况: SELECT s.Question_Id, s.Question, CASE WHEN ( SUM(CASE WHEN sr.Answer = 1 THEN 1 WHEN sr.Answer = 0 THEN 0 ELSE NULL END) ) IS NULL THEN 'N/A' ELSE CAST(SUM(CASE WHEN sr.Answer = 1 THEN 1 WHEN sr.Answer = 0 THEN 0 ELS
SELECT s.Question_Id, s.Question,
CASE WHEN
( SUM(CASE WHEN sr.Answer = 1 THEN 1 WHEN sr.Answer = 0 THEN 0 ELSE NULL END)
) IS NULL THEN 'N/A'
ELSE CAST(SUM(CASE WHEN sr.Answer = 1 THEN 1 WHEN sr.Answer = 0 THEN 0 ELSE NULL END) AS VARCHAR) END
AS Answered_Yes
FROM SurveyResult sr
INNER JOIN Survey s
ON sr.Question_Id = s.Question_Id
GROUP BY s.Question_Id, s.Question
为了更好地理解查询,它返回一个包含“是”答案总和的调查结果
注意:我之所以执行CAST
,是因为CASE
语句只能返回单个数据类型,而不是返回NULL,我希望返回N/a。
所以我的问题是这一行(在ELSE
中):
真的跑了两次?根据执行计划,它确实有一个额外的计算标量操作,但它是否使用缓存,因为它刚刚在WHEN
语句的第一次检查中完成了完全相同的检查
希望我的问题很清楚,因为我以前遇到过这种情况,希望了解查询的性能影响。我不确定执行计划中的额外标量运算符,但您的查询可以这样简化
SELECT s.Question_Id,
s.Question,
Isnull(cast(Sum(CASE sr.Answer
WHEN 1 THEN 1
WHEN 0 THEN 0
ELSE NULL
END) as varchar(100)), 'N/A') AS Answered_Yes
FROM SurveyResult sr
INNER JOIN Survey s
ON sr.Question_Id = s.Question_Id
GROUP BY s.Question_Id,
s.Question
但我想执行计划还是一样的 我不确定执行计划中是否有额外的标量运算符,但您的查询可以这样简化
SELECT s.Question_Id,
s.Question,
Isnull(cast(Sum(CASE sr.Answer
WHEN 1 THEN 1
WHEN 0 THEN 0
ELSE NULL
END) as varchar(100)), 'N/A') AS Answered_Yes
FROM SurveyResult sr
INNER JOIN Survey s
ON sr.Question_Id = s.Question_Id
GROUP BY s.Question_Id,
s.Question
但我想执行计划还是一样的 首先,在CASE语句中不需要说“ELSE NULL”;默认的ELSE行为是返回空值。接下来,如果SurveyResult.Answer只能是1或0,那么您的查询可以进一步简化如下:
SELECT s.Question_Id,
s.Question,
Isnull(cast(Sum(sr.answer) as varchar(100)), 'N/A') AS Answered_Yes
FROM SurveyResult sr
INNER JOIN Survey s
ON sr.Question_Id = s.Question_Id
GROUP BY s.Question_Id, s.Question
首先,您永远不需要在CASE语句中说“ELSE NULL”;默认的ELSE行为是返回空值。接下来,如果SurveyResult.Answer只能是1或0,那么您的查询可以进一步简化如下:
SELECT s.Question_Id,
s.Question,
Isnull(cast(Sum(sr.answer) as varchar(100)), 'N/A') AS Answered_Yes
FROM SurveyResult sr
INNER JOIN Survey s
ON sr.Question_Id = s.Question_Id
GROUP BY s.Question_Id, s.Question
不完全是。这一行是:
SUM(当sr.Answer=1时为1,当sr.Answer=0时为1,然后为0,否则为空结束)
。我不认为SQL Server足够聪明,可以将其优化掉,尽管我可能错了。请注意,在没有指定长度的情况下强制转换为varchar(将是varchar(1))并不完全正确。这一行是:SUM(当sr.Answer=1时为1,当sr.Answer=0时为1,然后为0,否则为空结束)
。我不认为SQL Server足够聪明来优化它,尽管我可能是错的。注意,在没有指定长度的情况下对varchar进行强制转换(将是varchar(1))+1非常出色,谢谢,这非常简单,避免了重复的CASE语句,只是仍然好奇它如何处理重复。。。谢谢你的帮助@你说的复制品是什么意思?你能添加样本数据和预期结果吗?如果你看到我的查询,我会执行两次,那么你的问题就解决了,有趣的是,尽管它的执行计划是相同的。但我宁愿用你的,更具可读性。谢谢+1太棒了,谢谢,这很容易避免重复案例陈述,只是好奇它如何处理重复。。。谢谢你的帮助@你说的复制品是什么意思?你能添加样本数据和预期结果吗?如果你看到我的查询,我会执行两次,那么你的问题就解决了,有趣的是,尽管它的执行计划是相同的。但我宁愿用你的,更具可读性。谢谢+1谢谢,这就是为什么我喜欢提问,学习新的东西,比如默认的ELSE行为返回NULL。+1谢谢,这就是为什么我喜欢提问,学习新的东西,比如默认的ELSE行为返回NULL。