PLSQL按问题排序

时间:2009-04-29 20:24:58

标签: sql plsql

回到第一版,然后进行了一些编辑。请参见修订后的question

下面的SELECT有一个有趣的问题。

关于ORDER BY子句;我正在尝试使用名为“p_sortby”的变量进行排序。

排序依据可以使用列名或列位置,(1,2,...等) 不知何故,如果我在PL / SQL中使用位置,它就不起作用。 所以我必须使用列名,我们不能简单地在那里传递varchar2字符串, 我们需要使用真正的列名。我注意到它只适用于varchar2类型的列。 它不适用于例如数字列。

关于如何解决这个问题,请大家告诉我。

/*I am sorry as I cannot paste the format correct here*/.

你们都可以编辑SELECT并输入所需的格式。

select distinct gl.group_id, gl.group_name
     from test_group gl
    where gl.group_org_id = p_orgid
      and (   gl.group_name_key like '%' || p_name || '%' 
              or p_name is null
              or p_name = ''
          )
      and (   gl.group_description_key like '%' || p_description || '%' 
              or p_description is null
              or p_description = ''
          )
      and (   gl.status_code = p_statuscode
              or p_statuscode is null
              or p_statuscode = 99
          )
      and gl.group_id in (
                  select gm.group_id
                      from test_group_member gm join test_org_person op
                                on gm.person_id = op.o_person_id
                           join test_person pp
                                on op.o_person_id = pp.person_id
                      where (   upper(pp.firstname) like
                                 '%' || upper(p_adminfirstname) || '%'
                                or p_adminfirstname is null
                                or p_adminfirstname = ''
                            )
                        and (   upper(pp.lastname) like
                                '%' || upper(p_adminlastname) || '%'
                                or p_adminlastname is null
                                or p_adminlastname = ''
                            )
                        and (   upper(op.emplid) like
                                '%' || upper(p_adminemployeeid) || '%'
                                or p_adminemployeeid is null
                                or p_adminemployeeid = ''
                            )
                        and gm.isadmin = 1)
     and gl.group_id in (
              select gm.group_id
                  from test_group_member gm join test_org_person op
                           on gm.person_id = op.o_person_id
                       join test_person pp
                           on op.o_person_id = pp.person_id
                  where (   upper(pp.firstname) like
                            '%' || upper(p_memberfirstname) || '%'
                            or p_memberfirstname is null
                            or p_memberfirstname = ''
                        )
                    and (   upper(pp.lastname) like
                            '%' || upper(p_memberlastname) || '%'
                            or p_memberlastname is null
                            or p_memberlastname = ''
                        )
                    and (   upper(op.emplid) like
                            '%' || upper(p_memberemployeeid) || '%'
                            or p_memberemployeeid is null
                            or p_memberemployeeid = ''
                        )
                    and gm.isadmin = 0) 

4 个答案:

答案 0 :(得分:6)

尝试使用DECODE()函数选择ORDER BY子句作为单独的列:

SELECT DECODE(p_sortby, 'ID', gl.group_id, 'NAME', group_name) AS sort, ...
...
ORDER BY 1

编辑:

我不确定你的意思是“不起作用”。如果您的意思是member_count未按预期排序,请使用TO_CHAR(gl.member_count,'000000')强制执行格式化的字符串转换。 (将格式掩码调整为预期的位数)

答案 1 :(得分:0)

如果你想这样做,你将不得不用PL / SQL做动态SQL。

DECLARE
  sql_str VARCHAR2(500);
  sortby  VARCHAR2(30) := 'your_column_name';
BEGIN
 -- Dynamic PL/SQL block invokes subprogram:
  sql_str := 'select * from your_table where a = 1 order by :a';

  OPEN CURSOR v_your_cursor for sql_str USING sortby;

  -- Then iterate your cursor.
END;
/

答案 2 :(得分:0)

非常感谢您的投入。我必须使用ORDER BY对变量p_sortby进行排序 p_sortby可以采用任何column_name或列位置。

答案 3 :(得分:0)

看起来像动态SQL就是你想要的。

当你做以下事情时:

...和(gl.group_name_key喜欢'%'|| p_name ||'%'或p_name为null或p_name ='')

优化器无法在group_name_key列上使用索引。你确定要这样做吗?