【问题标题】:PLSQL order by issuePLSQL 按问题排序
【发布时间】:2009-04-29 20:24:57
【问题描述】:

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

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

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

Order by 可以按列名或列位置使用,(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) 

【问题讨论】:

  • 我开始格式化代码。您可以通过选择您的代码并单击编辑框上方的二进制查找按钮来做到这一点。保留空格等。
  • Rohit - 下一次,用 4 个空格的缩进格式化代码,让问题的文本不缩进。我整理了乱七八糟的东西,以便@devio 因其出色的回答而得到应有的赞誉。但是,作为提问者,您有责任将问题格式化为易读性。请记得看预览。您还可以获得有关标记语言的帮助。最好避免水平滚动;如果一些长行强制它是可以的,但人们应该能够看到你的大部分代码。
  • @Rohit:还请注意,最好编辑您的问题以澄清,而不是添加“来自提问者的答案”,如下所示。
  • @Rohit:最后,就目前而言,请注意,当人们提供答案时删除问题的正文并不好——尤其是投票赞成的答案。您有责任让问题可见,以便其他人可以看到答案适用于什么。
  • 我认为您还真的想为您的搜索参数使用绑定变量。连接字符串不安全且速度慢。

标签: sql plsql


【解决方案1】:

尝试使用 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') 强制执行格式化字符串转换。 (将格式掩码调整为预期的位数)

【讨论】:

  • 假设 p_sortby = 'memberCount' 在这种情况下,我将它作为第一个参数传递给 decode() ** select distinct gl.group_id, decode('memberCount', 'name', gl.group_name_key ,'description', gl.group_description_key, 'memberCount', gl.member_count) as p_sortby ** 按 2 排序;它不起作用。但是,如果我在解码中将“名称”作为第一个参数传递,它就可以工作。这是我最初的问题,即为什么它不适用于 memberCount。
【解决方案2】:

如果你想这样做,你必须用 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;
/

【讨论】:

    【解决方案3】:

    非常感谢您的意见。我必须使用带有变量 p_sortby 的 ORDER BY 进行排序,其中 p_sortby 可以采用任何 column_name 或列位置。

    【讨论】:

      【解决方案4】:

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

      当您执行以下操作时:

      ... and (gl.group_name_key like '%' || p_name || '%' or p_name is null or p_name = '')

      优化器不能在 group_name_key 列上使用索引。您确定要这样做吗?

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 2023-03-08
        相关资源
        最近更新 更多