【问题标题】:Multiple fields check in case statement in SQL Server 2008SQL Server 2008 中的多个字段检查 case 语句
【发布时间】:2014-02-07 06:09:55
【问题描述】:
MySQL中的

Case Statement语法:-

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

Case Statement语法:-

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 语句中添加多个字段吗?” 如是 我们该怎么做呢?

【问题讨论】:

  • 您在没有事先研究的情况下提出问题而被否决,就像业余爱好者一样。就像在这里了解社区的练习一样,将鼠标悬停在任何问题旁边的投票箭头上。工具提示清楚地表明“这个问题显示了研究工作;它有用且清晰。”
  • 有两个正确答案我很困惑为什么都不被接受。
  • @Zane - 有 2 个答案,我的代码中没有尝试过任何一个,一得到结果就会接受。

标签: mysql sql sql-server-2008


【解决方案1】:

您在问题中的代码看起来不错 - 无论您在 or 下是否有一条红色波浪线。您是否尝试过执行它,或者您是否认为因为那里有一条红线,所以它不可能工作? IntelliSense 什么都不是——通常它落后了,或者它抱怨代码中其他地方与当前语句无关的事情。比如,你觉得这里的第二个说法真的有问题吗?

如果我突出显示该语句,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 ...

【讨论】:

  • 感谢您的编辑,以后会记住它。将在查询中尝试您的代码。看看它是否有效。
  • 记得以后不要在没有适当解释和完整代码的情况下提出问题。谢谢你的回答。
【解决方案2】:

您尝试了吗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;

【讨论】:

  • 好像你回答的很突然。我尝试了很多东西,我真诚地觉得在回答问题之前你应该尝试修改你的概念。
  • @Shivam657 我无法知道您打算在 2 小时后修改问题。也就是说,一旦我有一些空闲时间,我绝对会审查您的更改并适当地更改我的答案。
  • @Shivam657 我认为你应该在问之前三思而后行。你是需要帮助的人,对吧?
  • @AaronBertrand - 这个问题被否决了,因为人们认为 case 语句在 MSSQL 和 MySQL 中具有相同的语法,这是不对的。我不知道为什么它被解释为这样,并且投了反对票,即使它不值得投反对票。如果人们不确定这个问题,他们可以在投反对票和回答之前发表评论并澄清他们的疑问
  • @Avarkx - 但是仍然是什么投票否决了这个问题,因为你认为 case 语句在 MSSQL 和 MySQL 中具有相同的语法,所以我希望现在情况并非如此,并且问题很明确,应该投反对票被收回。
猜你喜欢
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2022-06-21
相关资源
最近更新 更多