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

时间:2014-01-17 19:09:43

标签: mysql sql sql-server-2008

MySQL 中的

案例陈述语法: -

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE
SQL Server 2008 中的

案例陈述语法: -

Simple CASE expression: 
CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 

关注SQL SERVER CASE STATEMENT SYNTAX

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

我在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

如果您正确看到案例陈述有2个字段(年份和购买)

当我在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

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

2 个答案:

答案 0 :(得分:5)

您是否尝试anything at all?您发布的MySQL语法与MSSQL CASE完全相同。

Revision 2

修改

您的查询问题主要在于您混合了CASE语法的两个有效表单。有两个,你在MySQL中使用第一个并在MSSQL查询中混合使用它们:

CASE
    WHEN <expression>
     AND <expression>
      THEN <result>
END

CASE <input>
    WHEN <expression>
     AND <expression>
      THEN <result>
END

修改 3:Never Trust a MySQL

由于众所周知MySQL允许大量completely whacky things,我去查看错误移植的查询是否会在MySQL上运行。令人惊讶的是(但并不令人震惊),it does。但是,值得注意的是原始的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;

的含义与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;

答案 1 :(得分:5)

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

  

enter image description here

如果我强调该陈述,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;

当然,我做了一些其他调整,例如当你必须使用reserved words (even future keywords)作为列名时(你真的应该解决这个问题),你应该正确地逃避它们,你应该always use the schema prefixget in the habit of using semi-colons as statement terminators

Meaningless SQL Fiddle example, since I have no idea of your sample data or desired results

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

CASE (col1 OR col2) WHEN something THEN ...