Sql where子句选择术语代码

Sql where子句选择术语代码,sql,oracle,Sql,Oracle,我正在做一份报告,选择一些关于学生的数据,并使用他们所在的术语代码,该代码与他们的GPA术语代码相对应 我们的术语代码是这样工作的:201410是春天201450是夏天201480是秋天。我需要看看他们上个学期的平均成绩(因为这学期还没有结束)。我正在写一个案例陈述来说明这一点,但运气不太好 如果学期代码在10学期内,我想选择上一个秋季学期等。任何帮助或提示将不胜感激 and TERM_CODE = :parm_DD_TermCode.TERM_CODE and (CASE WHEN

我正在做一份报告,选择一些关于学生的数据,并使用他们所在的术语代码,该代码与他们的GPA术语代码相对应

我们的术语代码是这样工作的:201410是春天201450是夏天201480是秋天。我需要看看他们上个学期的平均成绩(因为这学期还没有结束)。我正在写一个案例陈述来说明这一点,但运气不太好

如果学期代码在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)

据我所知,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隐式转换是一个非常糟糕的主意。上面的代码假设
术语代码
GPA术语代码
是字符串。

'%80'
就足够了…%是一个通配符,不一定意味着一个通配符字符,%可能意味着2014年。如果你想用另一个通配符来替换一个字符,那么它看起来像一个触发器,你能把它的其余部分发出来吗,因为我不理解这种代码情况。谢谢,如果可能的话,我建议使用滞后函数,我理解你的情况。这个函数在查询中返回上一个值。@DARK_A我也认为是在分析函数中,但请注意,这种情况是在一个条件内的,你不能在那里使用滞后函数,这就是为什么我要完整的代码我直到现在才听说滞后函数。。看起来很有趣。J-Dizzle感谢您的输入,这很可能会起作用(我现在遇到一个缺少关键字的错误。)Aramillo我的代码的其余部分到目前为止只是选择名称和连接表。。没有什么要真正处理这一部分:)谢谢,我只是想我应该用一个案例来说明GPA_TERM_代码本身,隐式转换也是我需要注意的,谢谢