我对下面的SELECT有一个有趣的问题.
它关于ORDER BY子句; 我正在尝试使用名为"p_sortby"的变量进行排序.
Order by可以由列名或列位置使用,(1,2,...等).
不知何故,如果我在PL/SQL中使用位置,它就不起作用.所以我必须使用列名,我们不能简单地在那里传递varchar2字符串,我们需要使用真正的列名.我注意到它只适用于varchar2类型的列.它不适用于例如数字列.
你能告诉我关于如何解决的这类问题.
/*I am sorry as I cannot paste the format correct here*/.
Run Code Online (Sandbox Code Playgroud)
你们都可以编辑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)
Run Code Online (Sandbox Code Playgroud)
尝试使用DECODE()函数选择ORDER BY子句作为单独的列:
SELECT DECODE(p_sortby, 'ID', gl.group_id, 'NAME', group_name) AS sort, ...
...
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)
编辑:
我不确定你的意思是"不起作用".如果您的意思是member_count未按预期排序,请使用TO_CHAR(gl.member_count,'000000')强制执行格式化的字符串转换.(将格式掩码调整为预期的位数)