Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 第二个CASE语句如何影响性能_Sql_Sql Server_Tsql_Case_Case When - Fatal编程技术网

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。