首页 > 解决方案 > 如何使 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列进行排序

我可以将文本ascdesc传递给pinSortOrder参数,并且查询需要相应地排序。你能帮我实现这一目标吗?

标签: oracleoracle11goracle10gsql-order-bydynamicquery

解决方案


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

假设您已经通过pinSortColumnasFullNamepinSortOrderasasc然后 order by 子句将是ORDER BY FULL_NAME, NULL DESC(请注意,默认顺序将是 asc,所以我没有在代码中编写它。查询将按 FULL_NAME 以升序方式排序)

现在,如果您通过了pinSortColumnasFullNamepinSortOrderasdesc那么 order by 子句将是ORDER BY NULL, FULL_NAME DESC

Null 不会影响排序。

我希望现在很清楚。

干杯!!


推荐阅读