我正在使用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'。
有人可以建议这段代码有什么问题吗?
答案 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