0

Oracle 11g 到目前为止我在 SQL Fiddle 上的工作

我在 varchar2 列上使用了lead()lag()函数。使用以下规则,我想生成所需的结果。

  1. 如果 lag_val 为空,则 '('
  2. 如果 lag_val 与 set_a 相同,则 'and'
  3. 如果 lag_val != set_a 那么 'or'
  4. 如果lead_val 为空,那么')'

当我使用 nvl() 转换空值以便进行比较时,我得到“无效数字”。

期望的输出

   SEQNO SET_A LAG_VAL  LEAD_VAL  MENU_ENTRY
   ------------------------------------------
   1      CAKE  <null>  CAKE      (
   2      CAKE  CAKE    BEER      AND
   3      BEER  CAKE    BRATS     OR
   4      BRATS BEER    <null>    )
4

1 回答 1

1

您的问题是您在字符串上使用“-”运算符,而不是超前/滞后。我想你想要这个:

select  seqno,
         set_a,
         lag_val,
         lead_val
    , case 
    when (lag_val ) is null then '('
    when (lead_val ) is null then ')'
    when (lag_val = set_a) then 'and'    
    else  'or'
    end  as menu_entry
from ( select seqno, 
        set_a, 
        lag(set_a,1) over (order by seqno) as lag_val,
--        lag(to_number,'XX') over (order by seqno) as lag_val,
        lead(set_a,1) over (order by seqno) as lead_val       
 from menu_items)
order by seqno
于 2013-03-26T18:08:53.483 回答