PLSQL заказ по выпуску - PullRequest
0 голосов
/ 30 апреля 2009

Откатился до первой редакции, потом отредактировал несколько. См пересмотренный вопрос .

У меня есть интересная проблема с нижеуказанным 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) 

Ответы [ 4 ]

6 голосов
/ 30 апреля 2009

Попробуйте выбрать предложение ORDER BY в качестве отдельного столбца, используя функцию DECODE ():

SELECT DECODE(p_sortby, 'ID', gl.group_id, 'NAME', group_name) AS sort, ...
...
ORDER BY 1

Edit:

Я не уверен, что вы подразумеваете под "не работает". Если вы имеете в виду, что member_count отсортирован не так, как вы ожидаете, используйте TO_CHAR (gl.member_count, '000000') для принудительного преобразования форматированной строки. (настроить маску формата на ожидаемое количество цифр)

0 голосов
/ 30 апреля 2009

Похоже, что динамический SQL - это то, что вам нужно.

Когда вы делаете такие вещи, как:

... и (gl.group_name_key как '%' || p_name || '%' или p_name имеет значение null или p_name = '')

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

0 голосов
/ 30 апреля 2009

Большое спасибо за ваш вклад. я должен сортировать, используя ORDER BY с переменной p_sortby где p_sortby может занимать любое имя столбца или позицию столбца.

0 голосов
/ 30 апреля 2009

Если вы хотите это сделать, вам придется выполнять динамический SQL с PL / 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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...