多个字段检查SQL Server 2008中的case语句

Shi*_*657 0 mysql sql sql-server-2008

MySQL中的Case语句语法: -

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE
Run Code Online (Sandbox Code Playgroud)

SQL Server 2008中的Case语句语法: -

Simple CASE expression: 
CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 
Run Code Online (Sandbox Code Playgroud)

按照SQL SERVER CASE语句语法

我已经解释了差异,以便用户可以理解我在这里尝试说的内容

我在MySql中有以下代码: -

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
Run Code Online (Sandbox Code Playgroud)

如果你看得正确,case语句有2个字段(Year和purchase)

当我在MS SQL SERVER 2008中尝试相同的代码时,当我尝试在SQL SERVER中的case语句中添加2个字段时,我在"或"下面有一个红线.

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
Run Code Online (Sandbox Code Playgroud)

所以简单的问题是"我们可以在SQL SERVER中的case语句中添加多个字段吗?" 如果是我们怎么做?

Ava*_*rkx 5

你有什么尝试吗? 您发布的MySQL语法和MSSQL CASE完全相同.

编辑版本2:

这里的查询问题主要是您要混合两种有效的CASE语法形式.有两个,你在MySQL中使用第一个并在MSSQL查询中混合使用它们:

CASE
    WHEN <expression>
     AND <expression>
      THEN <result>
END
Run Code Online (Sandbox Code Playgroud)

要么

CASE <input>
    WHEN <expression>
     AND <expression>
      THEN <result>
END
Run Code Online (Sandbox Code Playgroud)

编辑 3:永远不要相信MySQL

由于众所周知MySQL允许许多完全 令人讨厌的 东西,我去看看错误移植的查询是否会在MySQL上运行.令人惊讶的是(但并不令人震惊),确实如此.但是,值得注意的是原始的MySQL查询:

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;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

  • @ Shivam657我无法知道你打算在2小时后修改这个问题.也就是说,一旦我有一些空闲时刻,我将绝对审查你的变化并适当地改变我的答案. (2认同)
  • @ Shivam657我想你应该在问之前先考虑一下.你是那个想要帮助的人,对吧? (2认同)

Aar*_*and 5

你在问题中的代码看起来很好 - 无论你是否有一条红色的波浪线or.你有没有试过执行它,或者你是否认为因为那里有一条红线,它没有可行的方法吗?智能感知不是 - 通常它落后于它或者它抱怨代码中其他地方与当前语句无关的东西.例如,您认为这里的第二个陈述确实存在问题吗?

在此输入图像描述

如果我强调该声明,SELECT仍然会强调下划线,就好像它不正确一样.这并不意味着我执行它时会失败.

下面是一个示例,显示您的代码工作得很好,尽管您看到的是红色波浪形 - 可能是完全不相关的原因.

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;
Run Code Online (Sandbox Code Playgroud)

当然我做了一些其他的调整,例如当你必须使用保留字(甚至将来的关键字)作为列名(你真的应该修复它)时,你应该正确地转义它们,你应该总是使用模式前缀进入使用分号作为语句终止符的习惯.

毫无意义的SQL小提琴示例,因为我不知道您的样本数据或期望的结果.

最后,一个重要的语义事物:CASE表达式,而不是语句.您在语法图中忽略的重要一点是,搜索CASE表达式的输入和输出本身必须是单个表达式,并且SQL Server中没有布尔表达式.所以你不能说:

CASE (col1 OR col2) WHEN something THEN ...
Run Code Online (Sandbox Code Playgroud)