Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Конкатенация строк  [new]
ditban
Member

Откуда:
Сообщений: 261
Добрый день.
В таблице есть поля поле1, поле2, поле3.
Необходимо вывести поле1-поле2-поле3, но если поле3 null, то вывести поле1-поле2.
поле1 || '-' ||поле2|| '-' || поле3 - таким образом соединяю строки, но не знаю, как не добавлять последнее тире, если поле null
21 июл 15, 11:08    [17916024]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
isdenno
Member

Откуда:
Сообщений: 92
ditban,

decode(поле2, null, null, '-')
21 июл 15, 11:10    [17916044]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
ditban
Member

Откуда:
Сообщений: 261
isdenno,
спасибо, получилось
21 июл 15, 11:24    [17916141]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
ditban
Member

Откуда:
Сообщений: 261
подскажите еще по одному запросу. Есть таблицы документы, пути, отделы. документы связаны с путями (документы.d_id= пути.doc_id), пути с отделами (пути.o_id=отделы.o_id). Мне нужно в запросе вывести документ и через запятую отделы, с которым он связан через таблицу пути.
21 июл 15, 11:36    [17916208]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
isdenno
Member

Откуда:
Сообщений: 92
ditban,

тут
21 июл 15, 11:41    [17916236]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ditban,

пользуйтесь поиском
и в ТОП популярных зайдите - почитайте ..
21 июл 15, 11:42    [17916242]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
ditban, через запятую и немного то это listagg
21 июл 15, 11:43    [17916246]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
ditban
Member

Откуда:
Сообщений: 261
читал про listtag, когда все берется из одной таблицы, то понятно. мне нужно первую таблицу соединить со второй, а вторую - с третьей и вывести данные из третьей таблицы
21 июл 15, 11:48    [17916274]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
Добрый Э - Эх
Guest
ditban
читал про listtag, когда все берется из одной таблицы, то понятно. мне нужно первую таблицу соединить со второй, а вторую - с третьей и вывести данные из третьей таблицы
и что это меняет? сделай джойн всех нужных таблиц, представь, что результат этого джойна - одна мега таблица и делай свой listagg по одной таблице.
21 июл 15, 12:34    [17916478]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
сыс цоннет бы патх
Guest
ditban
с путями
можно предположить иерархию, а тогда листагг не нужен.
21 июл 15, 12:47    [17916545]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
ditban
Member

Откуда:
Сообщений: 261
делаю так:
select
d.d_code, listagg(l.L_WAY_NAME, ', ') within group (order by d_code)
from (documents d
left join  ways on w_doc=d_code) left join LIST_WAY l on ways.w_way=l.L_CODE
where d_date='29.06.2009'
group by d_code


в итоге выводит через запятую все l.L_WAY_NAME, которые есть в таблице LIST_WAY
21 июл 15, 13:53    [17916896]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
ditban
Member

Откуда:
Сообщений: 261
но мне нужно вывести только те, с которыми есть связи. что не так в запросе?
21 июл 15, 17:35    [17918016]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк  [new]
stranger1101
Member

Откуда: Москва
Сообщений: 43
ditban,

Приведите что ли тестовые данные, на которых воспроизводится такое поведение

ditban
все l.L_WAY_NAME, которые есть в таблице LIST_WAY


Захотелось убедиться, что правильно помню ansi-синтаксис. Вроде бы, выдаёт именно желаемое на таких входных данных.

with
    documents as (
                  select 'doc1' d_code, '29.06.2009' d_date from dual
        union all select 'doc2' d_code, '29.06.2009' d_date from dual
        union all select 'doc3' d_code, '29.06.2009' d_date from dual
        union all select 'doc4' d_code, '30.06.2009' d_date from dual
        union all select 'doc5' d_code, '30.06.2009' d_date from dual
    )
    , ways as (
                  select 'doc1' w_doc, 'way1.1' w_way from dual
        union all select 'doc1' w_doc, 'way1.2' w_way from dual
        union all select 'doc1' w_doc, 'way1.3' w_way from dual
        union all select 'doc3' w_doc, 'way3.1' w_way from dual
        union all select 'doc3' w_doc, 'way3.2' w_way from dual
        union all select 'doc0' w_doc, 'way0.1' w_way from dual
    )
    , list_way as (
                  select 'way1.1' l_code, 'way_name1.1' l_way_name from dual
        union all select 'way1.2' l_code, 'way_name1.2' l_way_name from dual
        union all select 'way1.3' l_code, 'way_name1.3' l_way_name from dual
        union all select 'way1.4' l_code, 'way_name1.4' l_way_name from dual
        union all select 'way3.1' l_code, 'way_name3.1' l_way_name from dual
        union all select 'way3.3' l_code, 'way_name3.3' l_way_name from dual
        union all select 'way0.1' l_code, 'way_name0.1' l_way_name from dual
    )
select
      d.d_code
    , listagg(l.L_WAY_NAME, ', ') within group (order by d_code)
from 
    documents d
    left join ways on w_doc=d_code
    left join LIST_WAY l on ways.w_way=l.L_CODE
where d_date='29.06.2009'
group by d_code
22 июл 15, 09:59    [17919929]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить