where子句选择术语代码

时间:2014-09-16 15:37:10

标签: sql oracle

我正在撰写报告,选择一些有关学生的数据,并使用与GPA术语代码相对应的术语代码。

我们的条款代码的工作方式如下:201410是2014年春季,2014年夏季是2014年夏季。我需要看看他们之前的学期GPA(因为本学期尚未完成)我正在写一个案例陈述来表示这一点,但我没有太多运气。

如果学期代码是10个学期,我想选择上一个秋季学期等。任何帮助或提示将不胜感激。

and TERM_CODE = :parm_DD_TermCode.TERM_CODE
and (CASE
      WHEN TERM_CODE LIKE '%%%%80'
           THEN GPA_TERM_CODE = (SUBSTR(:parm_DD_TermCode.TERM_CODE,1,4)||'50')
      WHEN TERM_CODE LIKE '%%%%50'
           THEN GPA_TERM_CODE = (SUBSTR(:parm_DD_TermCode.TERM_CODE,1,4)||'10')
      WHEN TERM_CODE LIKE '%%%%10'
           THEN GPA_TERM_CODE = (SUBSTR(:parm_DD_TermCode.TERM_CODE,1,4)-1||'80')
      END)

1 个答案:

答案 0 :(得分:2)

据我所知,Oracle SQL中没有布尔类型,因此您不能将CASE表达式计算为布尔值。幸运的是,在您的特定情况下,您不需要它:

and TERM_CODE = :parm_DD_TermCode.TERM_CODE
and GPA_TERM_CODE = CASE
  WHEN TERM_CODE LIKE '%80'
       THEN SUBSTR(:parm_DD_TermCode.TERM_CODE, 1, 4) || '50'
  WHEN TERM_CODE LIKE '%50'
       THEN SUBSTR(:parm_DD_TermCode.TERM_CODE, 1, 4) || '10'
  WHEN TERM_CODE LIKE '%10'
       THEN to_char(to_number(SUBSTR(:parm_DD_TermCode.TERM_CODE, 1, 4)) - 1) || '80'
  END

正如您所看到的,我还添加了一些显式类型转换:信任SQL隐式转换是特别糟糕的IDEA 。上面的代码假设TERM_CODEGPA_TERM_CODE是字符串。