有TABLE1这张表,里面有FIFO_FIELD1-FIFO_FIELD10,FIFO_SORT1-FIFO_SORT10共20个字段,
FIFO_FIELD1-FIFO_FIELD10是排序的字段名称,FIFO_SORT1-FIFO_SORT10是排序的方法。
我需要把判断里面的FIFO_FIELD1-FIFO_FIELD10和FIFO_SORT1-FIFO_SORT10共20个字段,如果不为空则加到sql的后面,并加豆号。
我写了一下的语句
if table1.fifo_FIELD1 IS NOT NULL THEN
    P_ORDER_BY:=P_ORDER_BY || ‘,’|| table1.fifo_FIELD1 ;
    IF table1.fifo_SORT1 ='D' THEN
        P_ORDER_BY:=P_ORDER_BY || 'DESC';
    END IF;
END IF;
如果用上面的方法,需要些10个这样的语句,请教大家,有没有更加简洁的办法。谢谢!

解决方案 »

  1.   


    把通用的写成一个procedure,再调用就好点了
    CREATE OR REPLACE PROCEDURE P_ORDER_CLAUSE (
    f1 in VARCHAR2, 
    f1_sort in VARCHAR2, 
    p_order_by in out varchar2) IS
    BEGIN
    if f1 IS NOT NULL THEN
      P_ORDER_BY:=P_ORDER_BY || ',' || f1 ;
      IF f1_sort ='D' THEN
      P_ORDER_BY:=P_ORDER_BY || 'DESC';
      END IF;
    END IF;
    END;-- 调用10次就好了
    P_ORDER_CLAUSE (table1.fifo_FIELD1, table1.fifo_SORT1 , P_ORDER_BY);
    P_ORDER_CLAUSE (table1.fifo_FIELD2, table1.fifo_SORT2 , P_ORDER_BY);
    P_ORDER_CLAUSE (table1.fifo_FIELD3, table1.fifo_SORT3 , P_ORDER_BY);
    P_ORDER_CLAUSE (table1.fifo_FIELD4, table1.fifo_SORT4 , P_ORDER_BY);
    P_ORDER_CLAUSE (table1.fifo_FIELD5, table1.fifo_SORT5 , P_ORDER_BY);
    P_ORDER_CLAUSE (table1.fifo_FIELD6, table1.fifo_SORT6 , P_ORDER_BY);
    P_ORDER_CLAUSE (table1.fifo_FIELD7, table1.fifo_SORT7 , P_ORDER_BY);
    P_ORDER_CLAUSE (table1.fifo_FIELD8, table1.fifo_SORT8 , P_ORDER_BY);
    P_ORDER_CLAUSE (table1.fifo_FIELD9, table1.fifo_SORT9 , P_ORDER_BY);
    P_ORDER_CLAUSE (table1.fifo_FIELD10, table1.fifo_SORT10 , P_ORDER_BY);-- 不知道还有更好的方法没?
      

  2.   

    谢谢你的回答,但是游标只能存储sql的执行结果,要实现结果还是需要10个上面的if语句。
    有没有实现这种判断的方便的函数。
      

  3.   

    10G可以这样简化一下:
    p_order_by := p_order_by || 
      nvl2(table1.fifo_FIELD1, ',' || table1.fifo_FIELD1, '') ||
      decode(table1.fifo_SORT1, 'D', ' DESC', ' ');
      

  4.   

    非常感谢!
    但是有一个问题,在table1.fifo_FIELD1为NULL,table1.fifo_SORT1为’D'的时候没有被排除。
      

  5.   

    把decode的那一段放到里面就好了
    p_order_by := p_order_by ||  
      nvl2(table1.fifo_FIELD1, ',' || table1.fifo_FIELD1 || decode(table1.fifo_SORT1, 'D', ' DESC', ' '), '');
      

  6.   

    支持2楼做法,不过有个问题想请教下,这张TABLE1表,为啥不设计成两列,一列是排序字段,一列是针对排序字段 的排序方式。
    LZ的做法如果有新的排序字段添加并且多余10个要修改表结构的。
    这是我的想法。多多指教
      

  7.   

    谢谢你的提醒。
    支持你的想法,现在的系统是每个用户可以自己定义排序方式,随意使用增加10个以下的字段来排序。
    现在这20个字段都被添加到USER表的后面,如果另外做成一张表(USERID,FILED_NAME,SORT)的话,
    就方便多了。数据库设计是有缺陷的。