Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Объединение ячеек / 7 сообщений из 7, страница 1 из 1
07.11.2012, 16:05
    #38028909
Xromou
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение ячеек
Добрый день.

Есть таблица TAb1 со столбцами col1, col2, col3, col4
Нужно объединить данные в одну строку через запятую, но если ячейка пустая тогда запятую не ставим.

То есть "col1, col2, col3, col4"
а если, допустим, col3 пустое, тогда нужно получить "col1, col2, col4"


Можно ли это сделать на sql??
...
Рейтинг: 0 / 0
07.11.2012, 16:45
    #38028992
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение ячеек
Xromou,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with t1(col1, col2, col3,col4) as (
  values ('1',  '2',  '3',  '4'),
         ('1',  '2',  '3',  NULL),
         ('1',  '2',  NULL, '4' ),
         ('1',  '2',  NULL, NULL),
         ('1',  NULL, '3',  NULL),
         ('1',  NULL, NULL, '4' ),
         ('1',  NULL, NULL, NULL),
         ('1',  '2',  '3',  '4' ),
         (NULL, '2',  '3',  NULL),
         (NULL, '2',  NULL, '4' ),
         (NULL, '2',  NULL, NULL),
         (NULL, NULL, '3',  NULL),
         (NULL, NULL, NULL, '4' ),
         (NULL, NULL, NULL, NULL)
),
t2(row_id, col1, col2, col3, col4) as (
  select ROW_NUMBER() OVER() as row_id, col1, col2, col3, col4
  from t1
),
t3(row_id, col_id, value) as (
  select row_id, 1, col1 from t2
  union all
  select row_id, 2, col2 from t2
  union all
  select row_id, 3, col3 from t2
  union all
  select row_id, 4, col4 from t2
)

select LISTAGG(value, ', ') WITHIN GROUP (ORDER BY col_id)
 from t3
 group by row_id;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
'1, 2, 3, 4'
'1, 2, 3'
'1, 2, 4'
'1, 2'
'1, 3'
'1, 4'
1
'1, 2, 3, 4'
'2, 3'
'2, 4'
2
3
4
NULL

Если NULL в конце не нравится, можно заменить на COALESCE(LISTAGG(value, ', ') WITHIN GROUP (ORDER BY col_id), '')
...
Рейтинг: 0 / 0
07.11.2012, 16:46
    #38028995
Xromou
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение ячеек
Решил таким образом

Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
CASE WHEN col1 IS NOT NULL or col1 <> '' THEN col1 || ', ' END
|| CASE WHEN col2 IS NOT NULL or col2 <> '' THEN col2 || ', ' END
|| CASE WHEN col3 IS NOT NULL or col3 <> '' THEN col3 || ', ' END
CASE WHEN col4 IS NOT NULL or col4 <> '' THEN col4 END
FROM tab1



Правда последний элемент всегда должен быть не пустым. Решение крайне кривое. Подскажите более адекватное?
...
Рейтинг: 0 / 0
07.11.2012, 16:47
    #38028997
Xromou
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение ячеек
CawaSPb,

Большое спасибо.
...
Рейтинг: 0 / 0
07.11.2012, 16:58
    #38029025
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение ячеек
Xromou,

Я не уверен, что приведённое прямое (на сколько-нибудь значимых объёмах данных). Надо смотреть реальные планы выполнения.

В то время как грандиозный CASE, в который будет запихиваться вся матрица NULL/не NULL будет работать гарантированно быстро.
Правда размер этого CASE будет расти как квадрат от количества сливаемых колонок.
...
Рейтинг: 0 / 0
15.11.2012, 13:54
    #38039720
Объединение ячеек
CawaSPb,

select substr (value (',' || col1,'') || value (',' || col2,'') || value (',' || col3,'') || value (',' || col4,''),2)
from t1 where (value (col1,value (col2,value (col3,value (col4,'')))))<>'';
...
Рейтинг: 0 / 0
16.11.2012, 12:31
    #38041294
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение ячеек
Слободской Андрей,

Логично. Лучший вариант.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Объединение ячеек / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]