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)
我已经解释了差异,以便用户可以理解我在这里尝试说的内容
我在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语句中添加多个字段吗?" 如果是我们怎么做?
你有什么尝试吗? 您发布的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)
你在问题中的代码看起来很好 - 无论你是否有一条红色的波浪线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)
归档时间: |
|
查看次数: |
11651 次 |
最近记录: |