下面的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)
答案 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列上使用索引。你确定要这样做吗?