搞了一天,脑袋搞晕了,简单SQL问题,向高手们请教下!现在需求是:
 对于A表2011年之前的数据,取 B表中降序后的第一条记录,
 对于A表2011年之后的数据,取 B表中升序后的第一条记录。我写的SQL如下,但是有点错误:丢失关键字。
望高手帮忙修改下,谢谢!select a.id,a.contract_create_date, rate.region_code, rate.rate, rate.plipmtno
  from A a,
       (select r.id, r.region_code, r.rate, r.plipmtno, 
               row_number() over(partition by r.region_code order by r.period_id desc) rn_desc,
               row_number() over(partition by r.region_code order by r.period_id desc) rn_asc
         from B r
       ) rate
  where a.id = rate.id
    and (case when a.contract_create_date < to_date('2011-01-01', 'yyyy-mm-dd') then
                        rn_desc = 1
              else 
                        rn_asc = 1
          end rec
        );  

解决方案 »

  1.   

    在WHERE子句中使用CASE语句?第一次见到。。
      

  2.   

    --这样试一下
    SELECT a.id, a.contract_create_date, rate.region_code, rate.rate, rate.plipmtno
      FROM A a,
           (SELECT r.id,
                   r.region_code,
                   r.rate,
                   r.plipmtno,
                   row_number() over(PARTITION BY r.region_code ORDER BY r.period_id DESC) rn_desc,
                   row_number() over(PARTITION BY r.region_code ORDER BY r.period_id DESC) rn_asc
              FROM B r) rate
     WHERE a.id = rate.id AND
           (b.rn_desc = (CASE
             WHEN a.contract_create_date < to_date('2011-01-01', 'yyyy-mm-dd') THEN
              1 ELSE 0 END) OR
            b.rn_asc = (CASE
             WHEN a.contract_create_date >= to_date('2011-01-01', 'yyyy-mm-dd') THEN
              1 ELSE 0 END)
           )
      

  3.   


    case中只是一个函数而已,能使用函的地方都可以使用case,和普通函数使用方式没有什么区别
      

  4.   

    你where中的case when 肯定是不对的,不能那样写,where中是一个判断条件,而你case when 得到的结果,不会当做判断条件来用,智慧当做一个结果值,要用就要像“唐人”那样写WHERE a.id = rate.id AND
           (b.rn_desc = 
               (CASE WHEN a.contract_create_date < to_date('2011-01-01', 'yyyy-mm-dd') 
                          THEN 1 
                     ELSE 0 
                END) 
            OR
            b.rn_asc = 
               (CASE WHEN a.contract_create_date >= to_date('2011-01-01', 'yyyy-mm-dd') 
                          THEN  1 
                     ELSE 0 
                END)
           )
      

  5.   

    说白了,就是要将你表达式提出来,至于表达式的值等于什么,根据你逻辑来用case when 获取
    这样才能在where条件中算判断条件的表达式
      

  6.   


    --你的试试
    where a.id = rate.id
        and (case when a.contract_create_date < to_date('2011-01-01', 'yyyy-mm-dd') then
                            rn_desc = 1
                  else 
                            rn_asc = 1
              end);  
    --2
    where a.id = rate.id and 
    ((a.contract_create_date < to_date('2011-01-01', 'yyyy-mm-dd') and rn_desc = 1)
    or (a.contract_create_date>=to_date('2011-01-01', 'yyyy-mm-dd') and rn_asc = 1))--3
    where a.id = rate.id and
    (rn_desc=(case when a.contract_create_date < to_date('2011-01-01', 'yyyy-mm-dd') then 1 else 0 end)
    or
    rn_asc=(case when a.contract_create_date>=to_date('2011-01-01', 'yyyy-mm-dd') then 1 else 0 end))