有这样一张表M ,里面有三个字段分别为 a b c,这三个字段有可能其中一个为空值,或者其中两个为空值,再或者全部都为空值 三种情况;该采用什么方法来判断三个值取最大的那一个?
说明:这三个字段都是char类型的;

解决方案 »

  1.   

    nvl(字段,0)
    把为空的字段变成0 再比较
      

  2.   

    用nvl转换把空值为0;
    max:=a
    if a<b then 
    max:=b;
    end if;
    if max <c then 
    max:=c;
    end if;
      

  3.   

    SELECT deminid,ammountid,ammountvalue,
    (CASE WHEN (CASE WHEN nvl(a,0)-nvl(b,0) >0 THEN nvl(a,0) ELSE nvl(b,0)END) - nvl(c,0)>0 THEN (CASE WHEN nvl(a,0)-nvl(b,0) >0 THEN nvl(a,0) ELSE nvl(b,0)END
    ELSE nvl(c,0)> END)
    FROM m
      

  4.   

    SELECT deminid,ammountid,ammountvalue FROM test1      DEMINID AMMOUNTID AMMOUNTVALUE
    1 1 1 2
    2 1 3 4
    3 1 5 6
    SELECT deminid,ammountid,ammountvalue,
    (CASE WHEN (CASE WHEN deminid-ammountid >0 THEN deminid ELSE ammountid END) - ammountvalue >0 THEN CASE WHEN deminid-ammountid >0 THEN deminid ELSE ammountid END
    ELSE ammountvalue END)MAXVALUES
    FROM test1
        DEMINID AMMOUNTID AMMOUNTVALUE MAXVALUES
    1 1 1 2 2
    2 1 3 4 4
    3 1 5 6 6
      

  5.   

    SELECT deminid,ammountid,ammountvalue,
           greatest(deminid,ammountid,ammountvalue) FROM test1 就能达到4楼的效果再多列,也就往里面填字段而已
      

  6.   


    select greatest(1,2,3) from dualresult:3
      

  7.   

    trim(GREATEST(lpad(a,20,' '),lpad(b,20,' '),lpad(c,20 ,' ')))
      

  8.   

    错了,改一下
    trim(GREATEST(lpad(' ' || a,20,' '),lpad(' ' || b,20,' '),lpad(' ' || c,20 ,' ')))
      

  9.   

    不好意思,刚才没说清楚,我是想用一条sql语句来实现,我自己用decode实现了一个,可不敢保证逻辑上完全正确
    select 
    m.id,
    decode(sign(decode(sign(m.a-m.b),1, m.a, m.b) - m.c),1,decode(sign(m.a-m.b),1,m.a,m.b),m.c) num
    from 
     M m
    where 
    m.empid
    not in(
        select 
          e.id
        from
          M e
        where e.a is null
        and e.b is null
        and e.c is null 
    )
    我把三个都为空的过滤掉,然后进行比较;不知道这样行不行,如果不行的话该怎么写呢?请高手指点指点...
      

  10.   

    select greatest(1,2,3) from dual 
      

  11.   

    三个字段如果有1个或两个字段为空的情况下用greatest()好象不行啊!!!
    而且还有这么个问题:同一个id的记录有多条数据的情况