首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server 2008中的多个字段签入case语句

Server 2008中的多个字段签入case语句
EN

Stack Overflow用户
提问于 2014-01-17 19:09:43
回答 2查看 11.9K关注 0票数 0

Case语句语法(MySQL):-

代码语言:javascript
复制
CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

Case语句语法( Server 2008):-

代码语言:javascript
复制
Simple CASE expression: 
CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 

遵循SQL服务器CASE语句语法

我已经解释了不同之处,以便用户能够理解我在这里要说的是什么。

我在MySql中有以下代码:

代码语言:javascript
复制
SELECT sum(case when Year=2014 or purchased=0 then 0 else TC.TOTAL_SP_COST-TC.TOTAL_CP_COST end) as EARNINGs

from TABLE TC

如果您正确地看到case语句,有2个字段(年份和购买)

当我尝试在MS SQL SERVER 2008中使用相同的代码时,当我试图在SQL SERVER中添加2字段时,我得到了"or“下面的红线。

代码语言:javascript
复制
SELECT sum(case (Year or purchased) when 2014 then 0 when 0 then 0 else TC.TOTAL_SP_COST-TC.TOTAL_CP_COST end) as EARNINGs

因此,简单的问题是“我们可以在SQL SERVER中的case语句中添加多个字段吗?”如果是的话,我们怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-17 22:29:27

问题中的代码看起来很好--无论您在or下面是否有一条红线。您是否尝试过执行它,或者您是否认为由于那里有一条红线,所以不可能工作?IntelliSense不是任何东西--通常是落后的,或者它抱怨代码中其他地方与当前语句无关的事情。例如,您认为这里的第二个语句真的有问题吗?

如果我强调这一声明,SELECT仍然会被加下划线,好像它是不正确的。这并不意味着当我执行它的时候它就会失败。

这里有一个例子,说明您的代码运行良好,尽管您看到的是红色的,这可能是一个完全不相关的原因。

代码语言:javascript
复制
CREATE TABLE dbo.[TABLE]
(
  [Year] INT,
  purchased BIT,
  TOTAL_SP_COST INT,
  TOTAL_CP_COST INT
);

SELECT SUM(CASE WHEN [Year] = 2014 OR purchased = 0 THEN 0 
  ELSE TOTAL_SP_COST - TC.TOTAL_CP_COST END) AS EARNINGs
FROM dbo.[TABLE] AS TC;

当然,我还做了一些其他的调整,例如,当您必须使用保留词(甚至将来的关键字)作为列名(您确实应该修复它)时,您应该正确地转义它们,您应该使用始终使用架构前缀养成使用分号作为语句终止符的习惯

没有意义的sample示例,因为我不知道您的示例数据或期望的结果

最后,一个重要的语义问题是:CASE是一个表达式,而不是一个语句。语法图中缺少的重要一点是,搜索到的CASE表达式的输入和输出本身必须是一个表达式,Server中没有布尔表达式。所以你不能说:

代码语言:javascript
复制
CASE (col1 OR col2) WHEN something THEN ...
票数 5
EN

Stack Overflow用户

发布于 2014-01-17 19:19:35

您是否尝试过有什么发现吗?、您已经发布的MySQL语法和MSSQL CASE完全相同。

编辑 for 修订2

这里的查询的主要问题是,您混淆了CASE语法的两个有效表单。有两个,您在MySQL中使用第一个,在MSSQL查询中将两者混合使用:

代码语言:javascript
复制
CASE
    WHEN <expression>
     AND <expression>
      THEN <result>
END

代码语言:javascript
复制
CASE <input>
    WHEN <expression>
     AND <expression>
      THEN <result>
END

编辑 3:永远不要相信MySQL

由于MySQL允许大量的完全地 怪诞 事物,所以我去查看错误移植的查询是否会在MySQL上运行。令人惊讶(但并不令人震惊),确实是这样的。但是,值得注意的是,原始的MySQL查询:

代码语言:javascript
复制
SELECT SUM( CASE 
           WHEN ( Year = 2014 OR purchased = 0 )
             THEN 0
           ELSE TC.TOTAL_SP_COST - TC.TOTAL_CP_COST 
       END ) AS EARNINGs
FROM `TABLE` TC;

它的含义与MySQL兼容的第二个查询有很大不同,这里省略了SUM,还有第二列来说明如何计算表达式:

代码语言:javascript
复制
SELECT CASE ( Year OR purchased ) 
           WHEN 2014 
             THEN 0 -- This line is unreachable;  [BOOLEAN]: { , 0, 1 }
           WHEN 0 
             THEN 0 -- This line only possible when Year == 0;  Bad Year data;
           ELSE TC.TOTAL_SP_COST - TC.TOTAL_CP_COST
       END AS EARNINGs,
       ( Year OR purchased ) AS Res
FROM `TABLE` TC;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21193919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档