Возврат LOV в порядке выбора списка по выводу - PullRequest
0 голосов
/ 13 ноября 2018

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

select case
       when USER_STATUS = '0' then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
       else  LAST_NAME || ',' || CDISPLAYNAME 
       end as d, CID r
from   TABLE_TEST
order by d asc;

Объявление моей таблицы следующее.

create TABLE TABLE_TEST(
    LAST_NAME VARCHAR2(75 BYTE),
    CDISPLAYNAME VARCHAR2(50 BYTE),
    USER_STATUS NUMBER DEFAULT 1 --Can also be 0 (inactive) or 3 (System User)
);

Так что моя проблема в том, что возвращаемое значение в SELECT-LIST показано так:
*INACTIVE* Surname5,Prename5 *INACTIVE* Surname6,Prename6 *INACTIVE* Surname7,Prename7 Surname1,Prename1 Surname2,Prename2 Surname3,Prename3 Surname4,Prename4

но я хочу, чтобы это выглядело так
Surname1,Prename1 Surname2,Prename2 Surname3,Prename3 Surname4,Prename4 *INACTIVE* Surname5,Prename5 *INACTIVE* Surname6,Prename6 *INACTIVE* Surname7,Prename7

Теперь на мой вопрос. Я хочу, чтобы пользователи, помеченные как НЕАКТИВНЫЕ , размещались ниже «обычного» пользователя, но «обычный» пользователь располагал их в алфавитном порядке, поэтому простой order by d desc не работает для меня. Я не знаю, может ли это быть решено в настройках моей страницы ApEx или в самом коде SQL.
Я надеюсь, что вы понимаете мою проблему и предлагаете решение :)

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

После получения определения для таблицы, как показано ниже,

 create TABLE TABLE_TEST(
                         LAST_NAME VARCHAR2(75 BYTE),
                         CDISPLAYNAME VARCHAR2(50 BYTE),
                         USER_STATUS NUMBER DEFAULT 1 --Can also be 0 (inactive) or 3 (System User)
                        );

Некоторые из фиктивных данных, вставленных в таблицу, как показано ниже:

 select * from table_test;

 LAST_NAME  CDISPLAYNAME    USER_STATUS
     A              T1        1
     B              T1        1
     B1             T2        0
     B2             T3        0
     B3             T4        1

Когда я запускаю заданный вами запрос, который выОпубликовано выше:

  select 
       case
       when USER_STATUS = '0' 
       then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
       else  LAST_NAME || ',' || CDISPLAYNAME 
        end as d, CID r
   from TABLE_TEST
  order by d asc;

Таблица не содержит столбец CID, поэтому он не работает.Таким образом, после удаления столбца CID,

  select 
       case
       when USER_STATUS = '0' 
       then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
       else  LAST_NAME || ',' || CDISPLAYNAME 
        end as d
   from TABLE_TEST
  order by d asc;

Выходные данные:

 D
 *INACTIVE* B1,T2
 *INACTIVE* B2,T3
  A,T1
  B,T1
  B3,T4

Таким образом, измененный запрос:

   WITH T as
           (select case
               when USER_STATUS = '0' 
               then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
               else  LAST_NAME || ',' || CDISPLAYNAME 
               end as d, CDISPLAYNAME r
              from   TABLE_TEST
             order by d asc)

             select * from T order by d desc;

Итак, вывод:

    D               R
    B3,T4           T4
    B,T1            T1
    A,T1            T1
  *INACTIVE* B2,T3  T3
  *INACTIVE* B1,T2  T2

Итак, все неактивные данные появляются наконец.

0 голосов
/ 13 ноября 2018

Используйте CASE в ORDER BY и добавьте '1' и '0' соответственно к началу строки, чтобы расставить приоритеты сортировки

SELECT case
   when USER_STATUS = '0' then '*INACTIVE* '|| LAST_NAME || ',' || CDISPLAYNAME 
   else  LAST_NAME || ',' || CDISPLAYNAME 
   end as d
FROM TABLE_TEST
ORDER BY
  CASE WHEN USER_STATUS = '0' THEN  '1' || d
  ELSE '0' || d 
  END ASC
...