【问题标题】:fetch table column in case else statement in pl sql在pl sql中的case else语句中获取表列
【发布时间】:2019-02-19 07:24:35
【问题描述】:

查询在 TRUE 条件下正确获取 student_id,但在 else 条件下不获取 (max(gr_number)+1)。以下是我的疑问,请帮帮我。

 Select case when count(*) > 0 then student_id else (max(gr_number)+1) end student_id
 from student 
 where student_name ='faizan ahmed' 
 and email_id='abc@gmail.com' 
 and UPPER(student_dob)=UPPER('01-FEB-19') 
 and  rownum = 1 
 group by student_id, gr_number  ;

在 else 条件下返回 null。

【问题讨论】:

  • 不相关,但是:您不应将 DATE 值存储在 VARCHAR 列中。条件 UPPER(student_dob)=UPPER('01-FEB-19') 表明 student_dob 是一个 varchar 列 - 不要那样做。使用正确的DATE

标签: sql oracle case


【解决方案1】:

FALSE 条件是count() 不大于零。因此,没有找到记录时为 FALSE。因此 NULL 是正确的结果,因为gr_number 为空(未找到记录)所以max(gr_number) 为空而max(gr_number)+1 为空。

不确定您要达到什么目的,但如果您找不到特定的学生,这里有一个解决方案会返回一个值:

Select coalesce(s.student_id, g.gr_number+1) as student_id
from (select 1 as rn, max(gr_number) as gr_number
      from student ) g
left outer join
      ( select rownum as rn, student_id
        from student
        where student_name ='faizan ahmed' 
        and email_id='abc@gmail.com' 
        and UPPER(student_dob)=UPPER('01-FEB-19') 
        and  rownum = 1 ) s
 on s.rn = g.rn
  ;

【讨论】:

  • 您是否因为提出了一个新问题而拒绝接受此答案?如果是这样,那就糟糕了。
【解决方案2】:

如果您想获得每个学生的最大 gr_number,则不应按其分组,而应仅按学生 ID:

group by student_id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多