Вставьте дополнительный символ в ответ записи oracle - PullRequest
0 голосов
/ 13 марта 2020

У меня есть цель, я хочу выбрать первые 2 элемента в списке и последние 2, преобразовать их в строку и вставить между ними «→». Я написал код, который находит эти элементы и преобразует их в строку.

select t.DEVNAME
         from ( select t.DEVNAME,   
                       row_number () over (partition by keys order by SEQUENCE) rn_asc, 
                       row_number () over (partition by keys order by SEQUENCE desc) rn_desc 
                               from ASU_DEVICES t
                               where t.keys = 'STIG6JGK' 
             ) t 
where rn_asc <= 2 or rn_desc <= 2 

мой ответ:

B
СИЛОС 102
Конвейер 67
Конвейер 66

преобразование всех элементов в строку:

select LISTAGG(t.DEVNAME , ',') WITHIN GROUP (ORDER BY 1)
         from ( select t.DEVNAME,   
                       row_number () over (partition by keys order by SEQUENCE) rn_asc, 
                       row_number () over (partition by keys order by SEQUENCE desc) rn_desc 
                               from ASU_DEVICES t
                               where t.keys = 'STIG6JGK' 
             ) t 
where rn_asc <= 2 or rn_desc <= 2 

B,СИЛОС 102,Конвейер 67,Конвейер 66

Я хочу поставить отметку "→" между ними, но не могу ответить на мой запрос:

B,СИЛОС 102 → Конвейер 67,Конвейер 66

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Мой вариант)

WITH txn as ( select one, two,trea   from  (
SELECT  (
                                   select LISTAGG(t.DEVNAME , ',') WITHIN GROUP (ORDER BY 1)
                                       from ( select t.DEVNAME,
                                         row_number () over (partition by keys order by SEQUENCE) rn_asc
                                         from ASU_DEVICES t
                                      --      where t.keys = 'STIG6JGK' 
                                       ) t 
                                            where rn_asc <= 2
                              ) AS one ,
                                   (select LISTAGG(c.DEVNAME , ',') WITHIN GROUP (ORDER BY 1)
                                      from ( select c.DEVNAME,   
                                        row_number () over (partition by keys order by SEQUENCE desc) rn_desc 
                                     from ASU_DEVICES c
                                    --  where c.keys = 'STIG6JGK' 
                                        ) c
                                      where rn_desc <= 2
                             ) AS two,
                               (select keys
                                     from ASU_DEVICES
                                    --  where keys = 'STIG6JGK' 
                                      group by  keys   )  as trea
                                  
                            from dual
))


select TRIM (txn.one  || ' 	⇒  '  || txn.two)  as routs  , txn.trea from txn
0 голосов
/ 14 марта 2020

Функция unistr() преобразует коды ascii / hex в набор национальных символов - см. Oracle документацию здесь .

Шестнадцатеричный код для стрелки вправо &#x2192;

Например:

select unistr('\2192') from dual вернет значение


По вашему вопросу:
При отсутствии исходной структуры таблицы / data, я смоделировал таблицу следующим образом:

    select * from asu_devices;

    | SEQUENCE  |DEVNAME        |KEYS       |
    | 1         |B              |STIG6JGK   |
    | 2         |СИЛОС 102      |STIG6JGK   |
    | 3         |Device X       |STIG6JGK   |
    | 4         |Device Y       |STIG6JGK   |
    | 5         |Конвейер 67    |STIG6JGK   |
    | 6         |Конвейер 66    |STIG6JGK   |


Вы можете попробовать следующий запрос:

    with 
    first_rows as 
     ( 
         select LISTAGG(t.DEVNAME , ',') WITHIN GROUP (ORDER BY 1) first_dev
         from ( select t.DEVNAME,   
         row_number () over (partition by keys order by SEQUENCE) rn_asc 
         from ASU_DEVICES t
         where t.keys = 'STIG6JGK' 
         ) t 
         where rn_asc <= 2 
     ),
     last_rows as 
     (
         select LISTAGG(t.DEVNAME , ',') WITHIN GROUP (ORDER BY 1) last_dev
         from ( select t.DEVNAME,   
         row_number () over (partition by keys order by SEQUENCE desc) rn_desc 
         from ASU_DEVICES t
         where t.keys = 'STIG6JGK' 
         ) t 
         where rn_desc <= 2 
     )
    select first_dev || ' ' || unistr('\2192') || ' ' || last_dev 
    from first_rows cross join last_rows;


Выход:

B,СИЛОС 102 → Конвейер 66,Конвейер 67


Демо здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...