oracle - 如何使 Oracle 查询排序顺序动态化?
问题描述
我在这样的包中有一个 Oracle 程序
PROCEDURE getEmployee
(
pinLanguage IN VARCHAR2,
pinPage IN NUMBER,
pinPageSize IN NUMBER,
pinSortColumn IN VARCHAR2,
pinSortOrder IN VARCHAR2,
poutEmployeeCursor OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN poutEmployeeCursor FOR
SELECT * FROM (
SELECT EMPLOYEE_ID, USERNAME, FULL_NAME, DATE_OF_BIRTH, EMP.GENDER_ID, GEN_TR.GENDER, EMP.WORK_TYPE_ID, WT_TR.WORK_TYPE, SALARY, EMAIL, PROFILE_IMAGE,
ROW_NUMBER() OVER (ORDER BY EMPLOYEE_ID ASC) RN
FROM EMPLOYEES EMP
INNER JOIN GENDERS GEN ON EMP.GENDER_ID = GEN.GENDER_ID
LEFT JOIN GENDERS_MLD GEN_TR ON GEN.GENDER_ID = GEN_TR.GENDER_ID AND GEN_TR.LANGUAGE = pinLanguage
INNER JOIN WORK_TYPES WT ON EMP.WORK_TYPE_ID = WT.WORK_TYPE_ID
LEFT JOIN WORK_TYPES_MLD WT_TR ON WT.WORK_TYPE_ID = WT_TR.WORK_TYPE_ID AND WT_TR.LANGUAGE = pinLanguage
)
WHERE RN BETWEEN (((pinPage - 1) * pinPageSize) + 1) AND (pinPage * pinPageSize);
END;
我需要使上述查询的排序顺序动态
如果我将文本FullName传递给pinSortColumn参数,它需要对FULL_NAME列进行排序
如果我将文本DateOfBirth传递给pinSortColumn参数,它需要对DATE_OF_BIRTH列进行排序
如果我将文本Gender传递给pinSortColumn参数,则需要对GEN_TR.GENDER列进行排序
我可以将文本asc或desc传递给pinSortOrder参数,并且查询需要相应地排序。你能帮我实现这一目标吗?
解决方案
asc
您可以通过 for和desc
如下方式使用单独的顺序:
ORDER BY
CASE pinSortOrder WHEN 'asc' THEN
CASE pinSortColumn
WHEN 'FullName' THEN FULL_NAME
WHEN 'DateOfBirth' THEN to_char(DATE_OF_BIRTH,'yyyymmddhh24miss')
WHEN 'Gender' THEN GEN_TR.GENDER
END
END,
CASE pinSortOrder WHEN 'desc' THEN
CASE pinSortColumn
WHEN 'FullName' THEN FULL_NAME
WHEN 'DateOfBirth' THEN to_char(DATE_OF_BIRTH,'yyyymmddhh24miss')
WHEN 'Gender' THEN GEN_TR.GENDER
END
END DESC
假设您已经通过pinSortColumn
asFullName
和pinSortOrder
asasc
然后 order by 子句将是ORDER BY FULL_NAME, NULL DESC
(请注意,默认顺序将是 asc,所以我没有在代码中编写它。查询将按 FULL_NAME 以升序方式排序)
现在,如果您通过了pinSortColumn
asFullName
和pinSortOrder
asdesc
那么 order by 子句将是ORDER BY NULL, FULL_NAME DESC
。
Null 不会影响排序。
我希望现在很清楚。
干杯!!
推荐阅读
- inheritance - 与继承相关的 F# 编译错误
- typescript - 如何打破 Firestore 上的 querySnapshot?
- javascript - 如何使用 jQuery 在不同列表上分离和重新附加具有不同类的项目?
- ios - 如何在没有 Google 帐户的情况下使用 Firebase App 分发?
- php - php + mysql 查询仅从类函数返回单行(std 类)
- python - AttributeError:“Path3DCollection”对象没有属性“view_init”
- go - 如何从 cgo 获取 ac 变量?
- javascript - 在 shadow dom 中渲染 Google ReCaptcha
- javascript - 如何将nodejs请求路由到另一个nodejs应用程序?
- python - docker compose up generate (2005, "Unknown MySQL server host 'db' (-2)") 错误