Как динамически упорядочить результаты моего запроса в Oracle? - PullRequest
0 голосов
/ 24 марта 2011
SELECT   Tbl.*,
          ROWNUM RN1
        FROM
          (
            SELECT DISTINCT( LEAVEID ),
                LEAVECODE,
                LEAVENAME,
                DESCRIPTION,
                STATUS
             FROM HRM_LEAVECONFIGURATION
              WHERE
                (
                  (
                    :LEAVENAME IS NULL OR
                    UPPER( LEAVENAME ) LIKE UPPER( :LEAVENAME )
                  )
                  AND
                  (
                    :STATUS IS NULL OR
                    STATUS   = :STATUS
                  )
                  AND
                  (
                    ISFIXED <> 1 OR
                    ISFIXED IS NULL
                  )
                  AND
                  (
                    :LEVECODE         IS NULL OR
                    UPPER( LEAVECODE ) = UPPER( :LEVECODE )
                  )
                )
              ORDER BY(
                  CASE
                      (
                        SELECT   t.data_type
                          FROM user_tab_columns t
                          WHERE t.TABLE_NAME = 'HRM_LEAVECONFIGURATION' AND
                            t.COLUMN_NAME    = 'LEAVENAME'
                      )
                    WHEN 'VARCHAR2'
                    THEN 'UPPER(LEAVENAME)'
                    ELSE 'LEAVENAME'
                  END ) DESC
          )
          Tbl

Это код, с которым я столкнулся.

Здесь я передаю имя поля в качестве параметра, в соответствии с типом данных поля, которое я хочу дать в верхнем регистре.

Например, если в качестве столбца, который нужно упорядочить, я даю название квасного, если тип данных квинного имени varchar2, то порядок по верхнему (квасное имя) По убыванию, если тип данных марочного отличного от varchar, то порядок по простому названию.

Здесь моя проблема в том, что этот запрос работает, но он не получает заказ. Есть ли другие предложения?

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Я не уверен, при каких обстоятельствах тип данных столбца будет меняться. Наверняка LEAVENAME всегда будет VARCHAR2?

Так что все, что вам нужно, это:

  ORDER BY(
  CASE
      when :LEAVENAME is not null THEN UPPER(LEAVENAME)
    ELSE LEAVENAME
  END ) DESC

Возможно, ваша точная бизнес-логика отличается, и вы хотите упорядочить по тем столбцам, для которых вы фактически передаете значения. В этом случае вы должны написать что-то вроде этого:

  ORDER BY(
  CASE
      when :LEAVENAME is not null THEN UPPER(LEAVENAME)
      when :LEVECODE is not null THEN UPPER(LEVECODE)
    ELSE LEAVENAME
  END ) DESC

Между прочим, вам нужно быть осторожным с такими запросами. Они сбивают с толку оптимизатор, что означает, что они могут работать плохо в течение некоторого времени или даже все время. Динамическая сборка запроса часто является лучшим подходом.

0 голосов
/ 28 марта 2011

Я почти уверен, что вы не можете связать имена столбцов.

Порядок принадлежит одному слою. Вы сортируете набор результатов, из которого вы выбираете, но не окончательный набор. Порядок принадлежит после последнего Tbl в конце запроса.

...