使用Case语句时出现语法错误

时间:2017-10-21 18:53:36

标签: sql sql-server

我正在使用CASE语句根据select语句值打印各种季节

SELECT 
    (CASE WHEN (SELECT po.startdate 
                FROM TABLE1 po
                JOIN TABLE2 a ON po.paramid = a.paramid
                WHERE po.paramid = 60)
             THEN 
                (CASE WHEN DATEPART(month, po.STARTDATE) < 3 
                         THEN 'Winter'
                      WHEN DATEPART(month, po.STARTDATE) = 3 
                         THEN 
                            CASE WHEN DATEPART(day, po.STARTDATE) < 01 
                                    THEN 'Winter' 
                                    ELSE 'Spring' 
                            END
                     WHEN DATEPART(month, po.STARTDATE) < 6 
                        THEN 'Spring'
                     WHEN DATEPART(month, po.STARTDATE) = 6 
                        THEN
                           CASE WHEN DATEPART(day, po.STARTDATE) < 21 
                                   THEN 'Spring' 
                                   ELSE 'Summer' 
                           END
                    WHEN DATEPART(month, po.STARTDATE) < 9 
                       THEN 'Summer'
                    WHEN DATEPART(month, po.STARTDATE) = 9 
                       THEN 
                          CASE WHEN DATEPART(day, po.STARTDATE) < 21 
                                  THEN 'Summer' 
                                  ELSE 'Autumn' 
                          END
                   WHEN DATEPART(month, po.STARTDATE) < 12 
                      THEN 'Autumn'
                   WHEN DATEPART(month, po.STARTDATE) = 12 
                      THEN
                         CASE WHEN DATEPART(day, po.STARTDATE) < 1 
                                 THEN 'Autumn' 
                                 ELSE 'Winter' 
                         END) 
    END) 
FROM 
    tABLE1 PO

错误:

  

Msg 4145,Level 15,State 1,Line 5
  在预期条件的上下文中指定的非布尔类型的表达式,接近'THEN'。

有人可以建议这段代码有什么问题吗?

2 个答案:

答案 0 :(得分:2)

我无法想象这个表单的查询实际上做了什么有用的事情。但是,您的具体问题恰好在开头:

SELECT (case when (select po.startdate
                   from TABLE1 po join
                        TABLE2 a
                        on po.paramid = a.paramid
                   where po.paramid = 60
                  )
             then . . .

case期待一个布尔条件。它正在约会。因此,一个错误。修复此错误的简便方法是:

SELECT (case when exists (select po.startdate
                          from TABLE1 po join
                               TABLE2 a
                               on po.paramid = a.paramid
                          where po.paramid = 60
                         )
             then . . .

我不知道这是否是预期的逻辑。并且,我几乎可以肯定,如果查询运行它将无法执行您想要的操作(别名po被怀疑定义了两次)。

我建议你再问一个问题。描述您想要实现的逻辑。提供样本数据和所需结果。我怀疑你根本不需要子查询。

答案 1 :(得分:0)

看起来您的错误与使用的语法和格式有关,这些语法和格式看起来格格不入。我没有纠正错误,而是从头开始解决这个问题。

考虑到这一点,您希望尝试做的是根据特定的日期范围返回季节。其他人可能有另一种方式,但一种方法是这样的;

SELECT (CASE 
        WHEN d.DateMonth < 3 OR d.DateMonth = 12
            THEN 'Winter'
        WHEN d.DateMonth >=3 AND (d.DateMonth < 6
                                      OR (d.DateMonth = 6 AND d.DateDay < 21))
            THEN 'Spring'
        WHEN (d.DateMonth = 6 AND d.DateDay >= 21)
             AND (d.DateMonth < 9
                    OR (d.DateMonth = 9 AND d.DateDay < 21))
            THEN 'Summer'
        ELSE 'Autumn'
    END) AS Season
FROM TABLE1 po
JOIN TABLE2 a
  ON po.paramid=a.paramid
-- select the date components we want rather than calling
-- DATEPART each time we need a date segment
OUTER APPLY (SELECT DATEPART(MONTH, po.StartDate) AS DateMonth,
                    DATEPART(DAY, po.StartDate) AS DateDay) d
WHERE po.paramid=60