案例陈述语法: -
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语句中添加多个字段吗?” 如是 我们怎么做呢?
答案 0 :(得分:5)
您是否尝试anything at all?您发布的MySQL语法与MSSQL CASE
完全相同。
修改:
您的查询问题主要在于您混合了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
下有一条红色的波浪线。你有没有试过执行它,或者你是否认为因为那里有一条红线,它没有可行的方法吗?智能感知不是 - 通常它落后于它或者它抱怨代码中其他地方与当前语句无关的东西。例如,您认为这里的第二个陈述确实存在问题吗?
如果我强调该陈述,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 prefix和get 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 ...