SQL"错误的语法附近' IF' - 无法弄清楚问题

时间:2017-05-26 23:23:46

标签: sql sql-server syntax-error

我无法摆脱' IF'

附近的"错误的语法

使用开始和结束对CASE和IF Else语句进行了多次尝试。

第二行的第一个IF有错误:' IF'

附近的语法不正确

我缺少什么?!!!

谢谢,约翰

选择长查询的摘录。

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有错误:&#39; IF&#39;

附近的语法不正确

enter image description here

谢谢你!

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

3 个答案:

答案 0 :(得分:0)

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

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

此链接解释了IIF表达:

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

答案 1 :(得分:0)

如果不能在上面发布的语句中使用,您可以使用嵌套案例。

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

答案 2 :(得分:0)

用例改为

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