【问题标题】:SQL, Incorrect syntax on CASE statement near the keyword 'FROM'SQL,关键字“FROM”附近的 CASE 语句语法不正确
【发布时间】:2013-08-02 05:10:47
【问题描述】:

我试图让下面的代码工作,单独的两段代码(在WHEN 部分和ELSE 部分)工作,但是当在这个CASE 语句中使用时我得到一个错误

“'CAST' 附近的语法不正确,应为 'AS'。”错误。

基本上,如果WHEN 语句代码等于或大于24,则使用THEN 语句,如果它小于24,则使用ELSE 语句。

在尝试了几个小时后,我似乎无法让它工作,任何关于我哪里出错的迹象将不胜感激。

SELECT CASE 
        WHEN 
            (convert(float,datediff(mi, start_work, end_work))/60) >= '24'
        THEN
            (convert(float,datediff(mi, start_work, end_work))/60)
        ELSE
            (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
            * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114),
            CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0
            THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3
            ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))
            END) AS decimal) / 60
FROM  NDB.dbo.statusa 
INNER JOIN NDB.dbo.details ON statusa.vkey = details.vkey
INNER JOIN NDB.dbo.chegu ON statusa.ckey = NDB.dbo.chegu.gkey
WHERE start_time!= end_time AND string1 = Visit_Id and NDB.dbo.chegu.name = 'loft'
     AS [Working]

【问题讨论】:

  • (convert(float,datediff(mi, start_work, end_work))/60) >= '24' 不应在 24 左右加上引号。

标签: sql sql-server tsql syntax case


【解决方案1】:

您需要关闭您的case 声明

 case when ... then ... else ... end

【讨论】:

    【解决方案2】:

    FROM 子句之前应该有一个END,您还应该在CAST 之前删除(

    【讨论】:

      【解决方案3】:

      RIGHT() 函数没有第二个参数

      RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114),
      

      或者:你错过了 AS 小数后面的结束括号

      END ) AS decimal ) ) / 60
      

      【讨论】:

        【解决方案4】:

        没有右括号。

        SELECT CASE 
            WHEN 
                (convert(float,datediff(mi, start_work, end_work))/60) >= '24'
            THEN
                (convert(float,datediff(mi, start_work, end_work))/60)
            ELSE
                (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
                * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114),
                CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0
                THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3
                ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))
                END) AS decimal) / 60)
        

        【讨论】:

          【解决方案5】:

          未闭合的括号和 case 语句需要一个 END。

          SELECT CASE 
                      WHEN (convert(FLOAT, datediff(mi, start_work, end_work)) / 60) >= '24'
                          THEN (convert(FLOAT, datediff(mi, start_work, end_work)) / 60)
                      ELSE CAST(convert(VARCHAR(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) * 60 
                           + RIGHT(
                                  convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114), 
                                  CASE 
                                      WHEN CHARINDEX(':', convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0
                                          THEN LEN(convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) - 3
                                      ELSE LEN(convert(VARCHAR(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))
                                  END
                                  ) AS DECIMAL) / 60
                  END
          
          FROM NDB.dbo.statusa
          INNER JOIN NDB.dbo.details
              ON statusa.vkey = details.vkey
          INNER JOIN NDB.dbo.chegu
              ON statusa.ckey = NDB.dbo.chegu.gkey
          WHERE start_time != end_time
              AND string1 = Visit_Id
              AND NDB.dbo.chegu.NAME = 'loft' AS [Working]
          

          【讨论】:

            【解决方案6】:

            CASE 表达的两个基本公式 1) 简单的 CASE 表达式 一个简单的 CASE 表达式会根据多个值检查一个表达式。在 SELECT 语句中,简单的 CASE 表达式只允许进行相等检查;没有进行其他比较。一个简单的 CASE 表达式通过将第一个表达式与每个 WHEN 子句中的表达式进行等价比较来进行操作。如果这些表达式等价,则返回 THEN 子句中的表达式。

            2) 搜索到的 CASE 表达式 搜索到的 CASE 表达式允许比较运算符,以及在每个布尔表达式之间使用 AND 和/或 OR。简单 CASE 表达式仅检查等效值,不能包含布尔表达式。搜索到的 CASE 表达式的基本语法如下所示:

            在此处阅读更多信息:http://blog.sqlauthority.com/2007/04/14/sql-server-case-statementexpression-examples-and-explanation/

            【讨论】:

              【解决方案7】:

              这是您的代码的更正版本:

              SELECT CASE 
                      WHEN 
                          (convert(float,datediff(mi, start_work, end_work))/60) >= '24'
                      THEN
                          (convert(float,datediff(mi, start_work, end_work))/60)
                      ELSE
                          (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
                          * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114),
                          CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0
                          THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3
                          ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))
                          END) AS decimal) / 60 
                      END
              AS [Working]
              FROM  NDB.dbo.statusa  INNER JOIN NDB.dbo.details ON statusa.vkey = details.vkey INNER JOIN NDB.dbo.chegu ON statusa.ckey = NDB.dbo.chegu.gkey WHERE start_time!= end_time AND string1 = Visit_Id and NDB.dbo.chegu.name = 'loft'
              

              基本上,您在外部 SELECT..CASE 语句中缺少 END,并且所选列别名 [Working] 被错误地放在查询末尾而不是查询的 select 子句中。

              【讨论】:

                【解决方案8】:

                代码中有 2 个错误。
                首先,您在 CAST 前面有一个多余的括号,它不需要(并且永远不会关闭)。改变

                (CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)
                

                CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
                

                第二个: 在 CASE 语句的末尾,在 FROM 关键字之前添加 END(正如 @gefei 上面指出的那样)。您的最终代码应如下所示:

                SELECT CASE 
                        WHEN 
                            (convert(float,datediff(mi, start_work, end_work))/60) >= '24'
                        THEN
                            (convert(float,datediff(mi, start_work, end_work))/60)
                        ELSE
                            CAST(convert(varchar(2), dateadd(minute, datediff(minute, start_time, end_time), 0), 114) 
                            * 60 + RIGHT (convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114),
                            CASE WHEN CHARINDEX(':',convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114)) > 0
                            THEN LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))-3
                            ELSE LEN(convert(varchar(5), dateadd(minute, datediff(minute, start_time, end_time), 0), 114))
                            END) AS decimal) / 60
                        END
                FROM  NDB.dbo.statusa 
                INNER JOIN NDB.dbo.details ON statusa.vkey = details.vkey
                INNER JOIN NDB.dbo.chegu ON statusa.ckey = NDB.dbo.chegu.gkey
                WHERE start_time!= end_time AND string1 = Visit_Id and NDB.dbo.chegu.name = 'loft'
                     AS [Working] 
                

                【讨论】:

                  【解决方案9】:

                  我意识到这个答案对于奖励来说太迟了。但是你的剧本太长了。这将与您尝试实现的完全相同,修复代码中的错误,只是修补错误代码:

                  SELECT 
                    datediff(mi, 0, end_time - start_time)/60.0%24
                  FROM  
                   ....
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-12-18
                    • 2013-10-29
                    • 1970-01-01
                    • 2015-10-10
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多