select
sc.locationid, --here to get a result
(
if month(date()) between 8 and 12 then @semTerm = 'S1'
else @semTerm = 'S2'
end if
)as @semTerm
from student_class sc
where @semTerm = sc.semester
;
在db2学生管理系统中。只读访问权限。期望的结果是如果1月到6月,S2,如果8月到12月,S1。尝试根据当前日期戳设置变量,其中月份被隔离,然后分配给变量,然后与student_class表中的列进行比较。
也尝试过案例陈述,没有运气。无法在select语句之上声明@semTerm而没有错误。看了where子句解决方案也。我离开了吗?看起来很简单但很难用语法。将locationID作为student_class中的一列的更大语句的一部分。
答案 0 :(得分:1)
您无法在简单的IF
语句中使用SELECT
语句,必须使用CASE
:
select
sc.locationid, --here to get a result
case
when month(current date) between 8 and 12 then 'S1'
when month(current date) between 1 and 6 then 'S2'
else ''
end as semTerm
from
student_class sc
如果您只想查找当前学期的学生,那么您可能希望将CASE
语句移到WHERE
子句中:
select
sc.locationid, --here to get a result
sc.semester,
...
from
student_class sc
where
sc.semester = case
when month(current date) between 8 and 12 then 'S1'
when month(current date) between 1 and 6 then 'S2'
end
答案 1 :(得分:0)
CASE
表达式通常是在SELECT
语句中实现条件逻辑的方法。但是,如果你不必在每一行重新计算它会更有效,对吧?
一种方法是在公共表表达式中“预先计算”它,并作为您的选择标准加入:
with v (semester) as
( values
case
when month(current date) > 7 then 'S1'
when month(current date) < 7 then 'S2'
else null
end
)
select
sc.locationid,
sc.semester,
...
from
student_class sc
join
v on sc.semester = v.semester;
或强>
如果您发现当前的学期价值在许多其他地方都有用,另一种方法可能是创建一个“全局会话变量”来保存该值。 (z / OS除外)
create or replace variable
v_sememster char(2)
default
case
when month(current date) > 7
then 'S1'
when month(current date) < 7
then 'S2'
else null
end;
然后你可以有一个非常简单的查询:
select
sc.locationid,
sc.semester,
...
from
student_class sc
where
sc.semester = v_semester;