SQL Month与声明变量的比较

时间:2013-09-03 17:04:49

标签: sql db2

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中的一列的更大语句的一部分。

2 个答案:

答案 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;