【问题标题】:SQL "Incorrect Syntax near 'IF' - cannot figure out issueSQL“'IF'附近的语法不正确 - 无法找出问题
【发布时间】:2023-04-11 09:35:01
【问题描述】:

我无法摆脱“'IF' 附近的语法不正确

使用 begin 和 end 对 CASE 和 IF Else 语句进行了多次尝试。

第二行的第一个 IF 有错误:'IF' 附近的语法不正确

我错过了什么?!!!

谢谢,约翰

选择长查询的sn-p。

CASE when (pt.PRE_POST_MODE = NULL) then
/*Error ->*/IF (CONVERT(DATETIME, CONVERT(DATE, extra.END_DATE)) != null)
                begin
                    if (IsDate(rc.START_DATE)= 1) 
                        begin
                            select (CONVERT(DATETIME, CONVERT(DATE, extra.START_DATE)))
                        end
                    else if  (CONVERT(date, rc.START_DATE) < CONVERT(date, sh.SAIL_DATE_FROM))  
                        begin
                            select 'PRE'
                        end
                    end

                    if (IsDate(extra.END_DATE) = 1)
                    begin
                        if (IsDate(rc.START_DATE) = 1) 
                            begin
                                select CONVERT(DATETIME, CONVERT(DATE,extra.START_DATE))
                                --WHEN CAST(CONVERT(DATETIME, CONVERT(DATE, rc.START_DATE)) AS DATE) >= CAST(sh.SAIL_DATE_TO AS DATE) THEN 'POST'
                                if CONVERT(DATETIME, CONVERT(DATE, rc.START_DATE)) >= sh.SAIL_DATE_TO  
                                begin
                                    select 'POST'
                                end
                            end
                    end

           ELSE 
              SELECT pt.PRE_POST_MODE

        as PRE_POST_MODE,

第二行的第一个 IF 有错误:'IF' 附近的语法不正确

谢谢!

s://i.stack.imgur.com/7maMA.png

【问题讨论】:

  • 这不是 SQL Server 语法。您在查询中间没有 IF 语句。您不使用CASE 进行控制流。
  • 正如 gordon 所说,CASE 用于条件表达式,而不是控制流。
  • IF 用于控制流,而不是用于选择语句中的表达式。
  • 正如其他人指出的那样,您的代码中的 CASE 和 IF 语句存在混淆。我建议您改为解释您的目标是什么以及您将要实现的目标。这样你可能会得到更好的帮助。
  • 另外 pt.PRE_POST_MODE = NULL 也不起作用(与 != null 相同),您应该使用 IS NULL 和 IS NOT NULL

标签: sql sql-server syntax-error


【解决方案1】:

用例代替

CASE when (pt.PRE_POST_MODE = NULL) then
case when (CONVERT(DATETIME, CONVERT(DATE, extra.END_DATE)) != null)
 then (case when (IsDate(rc.START_DATE)= 1) then (CONVERT(DATETIME, CONVERT(DATE, extra.START_DATE))) 
        when (CONVERT(date, rc.START_DATE) < CONVERT(date, sh.SAIL_DATE_FROM)) then 'PRE' end)
when  (IsDate(extra.END_DATE) = 1) then (case when (IsDate(rc.START_DATE) = 1)  then CONVERT(DATETIME, CONVERT(DATE,extra.START_DATE)) 
                                case when CONVERT(DATETIME, CONVERT(DATE, rc.START_DATE)) >= sh.SAIL_DATE_TO  then 'POST' else '' end)  end)
           ELSE 
              pt.PRE_POST_MODE end)
              end

        as PRE_POST_MODE

【讨论】:

  • 感谢 Ravi(和 Gordon、Juan、Hatchet 等人)解释 CASE 用于条件表达式,IF 用于流控制
【解决方案2】:

正如其他人已经提到的那样,IF 是一个控制流语句,不能在 select 语句中使用。

但是,您可以使用 IIF 函数来实现此结果。您将能够使用 IIF 编写相同的表达式,但是结果太复杂了,我会寻找其他解决方案。

此链接解释了 IIF 表达式:

https://msdn.microsoft.com/pt-br/library/hh213574.aspx

【讨论】:

    【解决方案3】:

    如果不能与您发布的上述声明一样​​使用,您可以使用嵌套案例。

    http://www.sqlservercurry.com/2016/05/nested-case-statement-in-sql-server_15.html?m=1

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 2017-02-07
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多